SP查找列表或字符串之类的关键字

时间:2010-11-06 08:10:02

标签: sql sql-server stored-procedures

在我的mssql数据库中,我有一个包含文章(id,name,content)的表,其中包含关键字(id,name)以及文章和关键字ArticleKeywords(articleId,keywordID,count)之间的链接表。 Count是文章中该关键字的出现次数。

如何编写一个获取逗号分隔字符串列表的SP,并根据文章中关键字的出现次数向我提供具有此关键字的文章? 如果文章包含更多关键字,我想总结每个关键字的出现次数。

谢谢,Radu

3 个答案:

答案 0 :(得分:1)

虽然我不完全清楚逗号分隔字符串的来源是什么,但我认为你想要的是一个SP,它将字符串作为输入并产生所需的结果:

CREATE PROC KeywordArticleSearch(@KeywordString NVARCHAR(MAX)) AS BEGIN...

第一步是将逗号分隔的字符串垂直化为一个表格,其值为行。这是一个在this questionanother question中得到广泛处理的问题,因此请查看并选择其中一个选项。无论选择哪种方式,都将结果存储在表变量或临时表中。

DECLARE @KeywordTable TABLE (Keyword NVARCHAR(128))
-- or alternatively...
CREATE TABLE #KeywordTable (Keyword NVARCHAR(128))

对于查找速度,最好存储KeywordID,这样您的查询只需找到匹配的ID:

DECLARE @KeywordIDTable TABLE (KeywordID INT)
INSERT INTO @KeywordTable 
    SELECT K.KeywordID FROM SplitFunctionResult S 
    -- INNER JOIN: keywords that are nonexistent are omitted
    INNER JOIN Keywords K ON S.Keyword = K.Keyword

接下来,您可以开始编写查询。这将是:

SELECT articleId, SUM(count)
FROM ArticleKeywords AK
WHERE K.KeywordID IN (SELECT KeywordID FROM @KeywordIDTable)
GROUP BY articleID

或者代替WHERE,您可以使用INNER JOIN。我不认为查询计划会有太大不同。

答案 1 :(得分:1)

为了起见或论证,我们想要查找包含关键字 Foo Bar Shazam 的所有文章。

ALTER PROCEDURE spArticlesFromKeywordList

@KeyWords varchar(1000) = 'Foo,Bar,Shazam'
AS

SET NOCOUNT ON

DECLARE @KeyWordInClause varchar(1000)
SET @KeyWordInClause = REPLACE (@KeyWords ,',',''',''')

EXEC(
'
SELECT 
t1.Name as ArticleName,
t2.Name as KeyWordName,
t3.Count as [COUNT]
FROM ArticleKeywords t3
INNER JOIN Articles t1 on t3.ArticleId = t1.Id
INNER JOIN Keywords t2 on t3.KeywordId = t2.Id
WHERE t2.KeyWord in ( ''' + @KeyWordInClause  + ''') 
ORDER BY 
3 descending, 1
'
)

SET NOCOUNT OFF

答案 2 :(得分:0)

我想我明白你的意思是这样的,(不确定你用的是什么,但是)在PHP中(从你的描述)我会使用ORDER BY计数DESC语句查询ArticleKeywords(即最高的第一个) - 显然你可以“通过keywordID或articleid选择。用非常简单的术语(因为我是这个 - 简单而且可能有比我更好的人)你可以返回数组但是从它创建一个字符串有点像这样:

$arraytostring .= $row->keywordID.',';

如果你离开加入表,你可以创建这样的东西:

$arraytostring .= $row->keywordID.'-'.$row->name.' '.$row->content.',';

或者您可以将数组捕获为

$array[] = $row->keywordID;

并在循环外创建字符串。

注意:你有两个名为“name”的字段,一个在文章中,一个在关键字中,更容易重命名其中一个以避免任何冲突(假设它们不是相同的内容),即文章名称=标题和keywords name = keyword