选择基于来自单个表的关键字相关的文章 [英] SELECT related articles based on keywords from single table
问题描述
我工作的一个Web项目,显示了它的一个网页文章的细节和侧面我还需要证明基于关键字排名前5的相关文章
或标记
。
我不知道如何使用T-SQL,而不是做从code后面处理的一部分它,我完全可以做的。
我使用功能分裂我的关键字,并传递结果等查询来获取这不是为我工作所需的结果。
CREATE TABLE文章
(
INT条款ArticleID,
标题的varchar(200),
说明VARCHAR(500)
详细为nvarchar(MAX)
关键字VARCHAR(100)
)INSERT INTO条VALUES(1,壹条,文章递减,文章详细介绍,一,二,三')
INSERT INTO条VALUES(2,'第二条','文章递减,文章详细介绍,二,三,四)
INSERT INTO条VALUES(3,第二十三条,文章递减,文章详细介绍,三,四,五)
INSERT INTO条VALUES(4,第四条,文章递减,文章详细介绍,四,五,六)
INSERT INTO第VALUES(5,'第五条,文章递减,文章详细介绍,二,三')
INSERT INTO条VALUES(6,第一百零六条,文章递减,文章详细介绍,八,九)
INSERT INTO条VALUES(7,第一百零六条,文章递减,文章详细介绍,十,九')
INSERT INTO条VALUES(8第一百零六条,文章递减,文章详细','十一,八)
功能
CREATE FUNCTION [DBO]。[uf_SplitKeywords]
(@DELIMITER VARCHAR(5),
@LIST VARCHAR(MAX)
)
退货@TABLEOFVALUES表
(ROWID SMALLINT IDENTITY(1,1),
[VALUE] VARCHAR(MAX)
)
如
开始 DECLARE @LENSTRING INT WHILE LEN(@LIST)GT; 0
开始 SELECT @LENSTRING =
(CASE CHARINDEX(@DELIMITER,@LIST)
WHEN 0,则LEN(@LIST)
ELSE(CHARINDEX(@DELIMITER,@LIST)-1)
结束
) INSERT INTO @TABLEOFVALUES
SELECT SUBSTRING(@LIST,1,@LENSTRING) SELECT @LIST =
(CASE(LEN(@LIST) - @LENSTRING)
WHEN 0,则'
ELSE RIGHT(@LIST,LEN(@LIST) - @LENSTRING - 1)
结束
)
结束 返回 结束
我需要什么?
显示文章id为3
SELECT条款ArticleID,标题,关键词FROM WHERE条条款ArticleID = 3
然后我需要显示基于关键字的相关文章三,四,五
从选择的文章在这种情况下,应该是与文章 =条款ArticleID 3
在这种情况下,结果应该显示我id为1,2,3,4,5的文章关键字匹配,只有这些行。
我想用下面的查询是不工作来实现这一
SELECT TOP 5条款ArticleID,标题,关键词FROM WHERE文章中的关键字
(SELECT'''%'+价值+'%'''AS值与[uf_SplitKeywords](',','一,二,三'))
我会在这方面AP preciate帮助。
在 sqlFiddle 样品由于某种原因,我不能够创造我上面所说的功能在sqlFiddle。
ALTER FUNCTION [DBO]。[uf_SplitKeywords]
(@DELIMITER VARCHAR(5),
@LIST VARCHAR(MAX)
)
退货@TABLEOFVALUES表
(ROWID INT IDENTITY(1,1),
[VALUE] VARCHAR(MAX)
)
如
开始
声明@Pos INT
虽然LEN(@list)GT; 0
开始
选择@名次= CHARINDEX(@头,@列表,1)
如果波什@大于0
开始
INSERT INTO @TABLEOFVALUES([超值])VALUES(子(@列表,1,@波什-1))
选择@LIST = STUFF(@列表,1,@ POS,'')
结束
其他
开始
INSERT INTO @TABLEOFVALUES([超值])VALUES(@list)
选择@LIST =''
结束
结束
返回
结束
与
通话 SELECT DISTINCT b.ArticleID,b.Title,b.Description,b.Details,b.KeyWords从
(
从第A1 *
CROSS APPLY [DBO]。[uf_SplitKeywords]('',关键字)F1
凡a1.ArticleID = 3
) 一个
加入
(
从物品A2 *
CROSS APPLY [DBO]。[uf_SplitKeywords]('',关键字)F2
)b
在a.value中= b.Value
I am working on a web project which shows article details on one of it pages and on side i also need to show top 5 related article based on keywords
or tags
.
I am not sure how i can entirely do it using T-SQL rather than doing part of processing from code behind.
I using FUNCTION to split my keywords and pass results to other query to get desired result which is not working for me.
CREATE TABLE Article
(
ArticleID int,
Title varchar(200),
Description varchar(500),
Details nvarchar(MAX),
keywords varchar(100)
)
INSERT INTO Article VALUES(1, 'Article One','Article desc', 'article details', 'one,two,three')
INSERT INTO Article VALUES(2, 'Article Two','Article desc', 'article details', 'two,three,four')
INSERT INTO Article VALUES(3, 'Article three','Article desc', 'article details', 'three,four,five')
INSERT INTO Article VALUES(4, 'Article four','Article desc', 'article details', ',four,five,six')
INSERT INTO Article VALUES(5, 'Article five','Article desc', 'article details', 'two,three')
INSERT INTO Article VALUES(6, 'Article six','Article desc', 'article details', 'eight, nine')
INSERT INTO Article VALUES(7, 'Article six','Article desc', 'article details', 'ten, nine')
INSERT INTO Article VALUES(8, 'Article six','Article desc', 'article details', 'eleven, eight')
FUNCTION
CREATE FUNCTION [dbo].[uf_SplitKeywords]
( @DELIMITER VARCHAR(5),
@LIST VARCHAR(MAX)
)
RETURNS @TABLEOFVALUES TABLE
( ROWID SMALLINT IDENTITY(1,1),
[VALUE] VARCHAR(MAX)
)
AS
BEGIN
DECLARE @LENSTRING INT
WHILE LEN( @LIST ) > 0
BEGIN
SELECT @LENSTRING =
(CASE CHARINDEX( @DELIMITER, @LIST )
WHEN 0 THEN LEN( @LIST )
ELSE ( CHARINDEX( @DELIMITER, @LIST ) -1 )
END
)
INSERT INTO @TABLEOFVALUES
SELECT SUBSTRING( @LIST, 1, @LENSTRING )
SELECT @LIST =
(CASE ( LEN( @LIST ) - @LENSTRING )
WHEN 0 THEN ''
ELSE RIGHT( @LIST, LEN( @LIST ) - @LENSTRING - 1 )
END
)
END
RETURN
END
What i need?
Show article with id 3
SELECT ArticleID, Title, Keywords FROM Article WHERE ArticleID = 3
Then i need to show related article based on keywords three,four,five
From selected article as in this case should be article with articleid=3
in this case result should show me article with id 1,2,3,4,5 as keywords match with these rows only.
I am trying to achieve this with following query which is not working
SELECT TOP 5 ArticleID, Title, Keywords FROM Articles WHERE Keywords IN
(SELECT '''%'+ VALUE+ '%''' AS VALUE FROM [uf_SplitKeywords] (',', 'one,two,three'))
I would appreciate help in this regard.
Sample on sqlFiddle for some reason i am not able to create FUNCTION which i have mentioned above on sqlFiddle.
Alter FUNCTION [dbo].[uf_SplitKeywords]
( @DELIMITER VARCHAR(5),
@LIST VARCHAR(MAX)
)
RETURNS @TABLEOFVALUES TABLE
( ROWID int IDENTITY(1,1),
[VALUE] VARCHAR(MAX)
)
AS
BEGIN
Declare @Pos int
While LEN(@List) > 0
begin
Select @Pos=CHARINDEX(@Delimiter,@List,1)
if @Pos>0
begin
Insert into @TABLEOFVALUES ([Value]) Values (SubString(@List,1,@Pos -1))
Select @LIST = STUFF(@List,1,@Pos ,'')
end
else
begin
Insert into @TABLEOFVALUES ([Value]) Values (@List)
Select @LIST =''
end
end
Return
End
With call by
Select Distinct b.ArticleID,b.Title,b.Description,b.Details,b.KeyWords from
(
Select * from Article a1
CROSS APPLY [dbo].[uf_SplitKeywords](',',keywords) f1
Where a1.ArticleID=3
) a
Join
(
Select * from Article a2
CROSS APPLY [dbo].[uf_SplitKeywords](',',keywords) f2
) b
on a.Value=b.Value
这篇关于选择基于来自单个表的关键字相关的文章的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!