选择基于来自单个表的关键字相关的文章 [英] SELECT related articles based on keywords from single table

查看:93
本文介绍了选择基于来自单个表的关键字相关的文章的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆