Предполагается, что таблица Questions
со столбцом первичного ключа Id
, таблица Tags
также со столбцом первичного ключа Id
также и таблица соединения QuestionTags
с составным первичным ключом QuestionId
и TagId
ссылаясь на первичные ключи двух предыдущих таблиц, следующий запрос даст желаемый результат (в SQL Server 2005).
SELECT q1.Id AS Id1, q2.Id AS Id2,
(SELECT COUNT(*) FROM QuestionTags qt1 INNER JOIN QuestionTags qt2
ON qt1.QuestionId = q1.Id AND qt2.QuestionId = q2.Id AND qt1.TagId = qt2.TagId) AS TagCount
FROM Questions q1 INNER JOIN Questions q2 ON q1.Id < q2.Id
ORDER BY TagCount DESC
Это может быть улучшено до следующего.
SELECT qt1.QuestionId AS Id1, qt2.QuestionId AS Id2, COUNT(*) AS TagCount
FROM QuestionTags qt1 INNER JOIN QuestionTags qt2
ON qt1.QuestionId < qt2.QuestionId AND qt1.TagId = qt2.TagId
GROUP BY qt1.QuestionId, qt2.QuestionId
ORDER BY TagCount DESC