在我的mssql数据库中,我有一个包含文章(id,name,content)的表,其中包含关键字(id,name)以及文章和关键字ArticleKeywords(articleId,keywordID,count)之间的链接表。 Count是文章中该关键字的出现次数。
如何编写一个获取逗号分隔字符串列表的SP,并根据文章中关键字的出现次数向我提供具有此关键字的文章? 如果文章包含更多关键字,我想总结每个关键字的出现次数。
谢谢,Radu
答案 0 :(得分:1)
虽然我不完全清楚逗号分隔字符串的来源是什么,但我认为你想要的是一个SP,它将字符串作为输入并产生所需的结果:
CREATE PROC KeywordArticleSearch(@KeywordString NVARCHAR(MAX)) AS BEGIN...
第一步是将逗号分隔的字符串垂直化为一个表格,其值为行。这是一个在this question和another 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