Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SP查找列表或字符串之类的关键字_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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

Sql SP查找列表或字符串之类的关键字,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,在我的mssql数据库中,我有一个包含articlesid、name、content的表,一个包含keywordsid、name的表,还有一个项目和关键字ArticleKeywordsarticleId、keywordID、count之间的链接表。Count是该关键字在文章中出现的次数 如何编写一个SP来获取逗号分隔字符串的列表,并根据关键字在文章中的出现次数对具有该关键字的文章进行排序? 如果一篇文章包含更多的关键字,我想对每个关键字的出现次数求和 谢谢,Radu,我想我理解你的想法,所以我不

在我的mssql数据库中,我有一个包含articlesid、name、content的表,一个包含keywordsid、name的表,还有一个项目和关键字ArticleKeywordsarticleId、keywordID、count之间的链接表。Count是该关键字在文章中出现的次数

如何编写一个SP来获取逗号分隔字符串的列表,并根据关键字在文章中的出现次数对具有该关键字的文章进行排序? 如果一篇文章包含更多的关键字,我想对每个关键字的出现次数求和


谢谢,Radu,我想我理解你的想法,所以我不确定你在用什么语言,但在PHP中,根据你的描述,我会使用按计数排序的描述语句查询ArticleKeywords,也就是说,最高值排在第一位-显然,你可以按关键字ID或articleid进行选择。用非常简单的术语来说,因为这是我-简单&可能有比我更好的人,你可以返回数组,但从中创建一个字符串,有点像这样:

$arraytostring .= $row->keywordID.',';
$arraytostring .= $row->keywordID.'-'.$row->name.' '.$row->content.',';
如果离开join表,您可以创建如下内容:

$arraytostring .= $row->keywordID.',';
$arraytostring .= $row->keywordID.'-'.$row->name.' '.$row->content.',';
或者您可以捕获数组作为

$array[] = $row->keywordID;
并在循环外创建字符串


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

,尽管我不完全清楚逗号分隔字符串的来源,我认为您需要的是一个SP,它接受字符串作为输入并生成所需的结果:

CREATE PROC KeywordArticleSearch(@KeywordString NVARCHAR(MAX)) AS BEGIN...
第一步是将逗号分隔的字符串垂直缩放到一个表中,表中的值以行为单位。这是一个在和中被广泛处理的问题,因此只需查看并选择其中一个选项。无论您选择哪种方式,都将结果存储在表变量或临时表中

DECLARE @KeywordTable TABLE (Keyword NVARCHAR(128))
-- or alternatively...
CREATE TABLE #KeywordTable (Keyword NVARCHAR(128))
为了提高查找速度,最好存储关键字ID,这样您的查询只需找到匹配的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

或者不使用内部联接。我不认为查询计划会有太大的不同。

为了便于理解或讨论,让我们假设您希望查找包含关键字Foo、Bar和Shazam的所有文章


嗨,你的问题对我来说很清楚,除了。。。获取逗号分隔字符串的列表。它是从哪里来的?手动输入或从其他数据库或文本文件?我想做的是一个存储过程。。。因为有将近一百万篇文章。。。我不能把它们全部装进去。我有人可以给我的sp开始如何解析csv关键字和添加他们的ID到一个临时表这将是足够的感谢很多。你救了我一天:一个关于MSSQL的快速问题:当我在Name='%'+Name+'%'上有一个内部连接时,如何获得索引查找?呃。除非我忽略了某些内容,否则唯一的方法是将新字符串存储在临时表中:插入临时表,选择“%”+名称+“%”作为derivedname并在其上定义索引:在temp derivedname上创建索引index01。然后使用内部连接温度。但是你确定你的意思不是像“%”+名称+“%”?优化这将是一个不同的故事…我的联接有一个条件:名称类似“%”+名称+“%”。我可以优化它吗?奇怪的是,我在执行计划中得到了一个索引搜索。。。但我认为它可以扫描表格。怎么可能对“%”+名称+“%”之类的对象进行索引查找?我不知道,抱歉。但这将是一个令人敬畏的新问题!似乎以前也有人问过:这也很好。鉴于他有大约一百万篇文章,最好先把关键词转换成id,并在in子句中使用它。