2010-10-19 1 views
0

У меня есть таблица элементов, связанных с таблицей ключевых слов. Я хочу перечислить все элементы, которые разделяют ключевые слова, и я хочу ранжировать результаты, чтобы элементы, которые наиболее похожи, выглядят наивысшими. Итак, я рисую элементы, которые соответствуют всем ключевым словам, будут самыми высокими с элементами, которые соответствуют только одному ключевому слову, появляющемуся ниже в списке.Как ранжировать элементы, соответствующие ключевым словам по сходству

Если элементы соответствуют одинаковому числу ключевых слов, я хочу ранжировать результаты по частоте ключевого слова, так что элементы, которые имеют необычное ключевое слово, будут отображаться выше, чем элементы, которые часто используют ключевое слово, которое часто появляется.

В настоящее время моя схема выглядит так (но это может быть изменено, если это необходимо):

Item ItemKeywords Keywords 
____ ____________ ________ 
ID  ItemID   ID 
Item KeywordID  Word 

Я изо всех сил, чтобы даже начать с SQL, чтобы получить элементы, которые соответствуют большинству ключевых слов. Может ли кто-нибудь помочь? Я с помощью SQL Server 2005

EDIT - (добавил для полноты)

Использование 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 для устранения пар, и я ve добавил второй порядок по пунктам, чтобы учесть частоту y, что также используется слово. Но по существу Beth ответил на вопрос, так что я буду отмечать его в качестве ответа (большое спасибо)

+0

вы можете добавить пример того, что вы хотите? дайте нам 3 элемента, ключевые слова и достаточно itemkeywords, чтобы продемонстрировать результаты, которые вы хотите. – Beth

ответ

2
Select keywordID, count(itemID) as cnt_item 
from itemKeywords 
group by keywordID 
order by count(itemID) desc 

ОК, лучше понимать, что вы не хотите, попробуйте присоединиться 2 экземпляра таблицы itemKeyword на KeywordId поле, где Itemid не соответствует:

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 

затем, с этим набором, подсчитывают количество keywordIDs и возвращает список в порядке убывания:

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 
+0

Спасибо, Бет, но в этом списке указаны идентификаторы ключевых слов с теми, которые связаны с большинством элементов вверху. Я хочу элементы, наиболее похожие на другие предметы в верхней части. – Colin

+0

PS Вы забыли поставить «GROUP BY KeywordID» – Colin

+0

Да, это редактирование - подход, который я бы взял, я думаю. –