【发布时间】:2010-10-19 13:53:14
【问题描述】:
我有一个链接到关键字表的项目表。 我想列出所有共享关键字的项目,并且我想对结果进行排名,以便最相似的项目出现最高。 因此,我认为匹配所有关键字的项目将排名最高,仅匹配一个关键字的项目在列表中显示较低。
如果项目匹配相同数量的关键字,我想然后按关键字的频率对结果进行排名,这样共享不寻常关键字的项目将出现高于共享频繁出现的关键字的项目。
目前我的架构是这样的(但必要时可以更改):
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 以消除对,我已经将第二个顺序添加到还要考虑一个词的使用频率。但基本上贝丝回答了这个问题,所以我将其标记为答案(非常感谢)
【问题讨论】:
-
你能添加一个你想要的例子吗?给我们3个item,keywords,以及足够的itemkeywords来展示你想要的结果