У меня есть таблица элементов, связанных с таблицей ключевых слов.Я хочу перечислить все элементы с общими ключевыми словами и ранжировать результаты так, чтобы наиболее похожие элементы отображались наивысшими.Итак, я считаю, что элементы, которые соответствуют всем ключевым словам, будут наивысшими, а элементы, которые соответствуют только одному ключевому слову, будут отображаться ниже в списке.
Если элементы соответствуют одинаковому количеству ключевых слов, которые я хочу оценить, результаты ранжируются по частоте ключевого слова, так что элементы, которые имеют необычное ключевое слово, будут отображаться выше, чем элементы, которые имеют часто встречающееся ключевое слово.
В настоящее время моя схема похожа на эту (но это можно изменить при необходимости):
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
Я немного изменил синтаксис, чтобы избежать подзапроса (все делает при объединении), я изменил *От 1017 * до IK1.ItemID < IK2.ItemID
, чтобы исключить пары, и я добавил второй порядок по элементам, чтобы учесть частоту использования слова.Но, по сути, Бет ответила на вопрос, поэтому я отмечу его как ответ (большое спасибо)