我有一个链接到关键字表的项目表。 我想列出共享关键字的所有项目,并且我想对结果进行排名,以便最相似的项目显得最高。 因此,我认为匹配所有关键字的项目最高的项目只匹配列表中较低的一个关键字。
如果项目符合我想要的相同数量的关键字,则会根据关键字的频率对结果进行排名,以便共享不寻常关键字的项目会显得高于共享经常出现的关键字的项目。
目前我的架构是这样的(但必要时可以更改):
Item ItemKeywords Keywords
____ ____________ ________
ID ItemID ID
Item KeywordID Word
我很难开始使用sql来获取与大多数关键字匹配的项目。有人可以帮忙吗? 我正在使用Sql Server 2005
编辑 - (为完整性而添加)
使用Beth的SQL作为指针我已经提出了以下内容,我认为它正在按照我的意愿工作,只需要做更多的测试:
SELECT IK1.ItemID,
IK2.ItemID,
COUNT(IK2.KeywordID) AS KeywordCount,
MIN(WordFrequency) AS WordFrequency
FROM ItemKeywords IK1
INNER JOIN ItemKeywords IK2
ON IK1.KeywordID = IK2.KeywordID --Keywords match
AND IK1.ItemID < IK2.ItemID --Eliminate pairs (Bill & Ted but not Ted and Bill or Bill and Bill)
INNER JOIN (SELECT KeywordID, COUNT(*) WordFrequency
FROM dbo.ItemKeywords
GROUP BY KeywordID) AS KF
ON KF.KeywordID = IK2.KeywordID --Join to sub-query to get frequency of word
GROUP BY IK1.ItemID, IK2.ItemID
ORDER BY COUNT(IK2.KeywordID) DESC, MIN(WordFrequency) ASC --Order by most matching keywords then by most unusual word
我稍微修改了语法以避免子查询(在连接上执行所有操作),我已将IK1.ItemID <> IK2.ItemID
更改为IK1.ItemID < IK2.ItemID
以消除对,并且我添加了第二个按项目排序,以考虑使用单词的频率。但基本上Beth回答了这个问题所以我将其标记为答案(非常感谢)
答案 0 :(得分:2)
Select keywordID, count(itemID) as cnt_item
from itemKeywords
group by keywordID
order by count(itemID) desc
好的,更好地了解您不想要的内容,尝试在itemID不匹配的keywordID字段上加入itemKeyword表的2个实例:
select ik.itemID, ik1.itemID as itemID1, ik.keywordID
from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
where ik.itemID <> ik1.itemID
然后,使用该集合,计算keywordID的数量并按降序返回列表:
select itemID, itemID1, count(keywordID) as count_kwd
from
( select ik.itemID, ik1.itemID as itemID1, ik.keywordID
from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
where ik.itemID <> ik1.itemID
) t
group by itemID, itemID1
order by count(keywordID) desc