Как найти записи с наиболее распространенными тегами, например, связанные вопросы в StackOverflow - PullRequest
7 голосов
/ 29 октября 2008

Мы можем пометить вопрос несколькими тегами на веб-сайте StackOverflow, мне интересно, как найти наиболее связанные вопросы с общими тегами.

Предположим, у нас есть 100 вопросов в базе данных, каждый вопрос имеет несколько тегов. Допустим, пользователь просматривает конкретный вопрос, и мы хотим, чтобы система отображала связанные вопросы на странице. Критерии для связанного вопроса - у них есть самые общие признаки.

Например: Вопрос 1 помечен как AAA, BBB, CCC, DDD, EEE.

Вопрос 2 относится к топ-1, поскольку в нем также есть все эти 5 тегов. Вопрос 3 относится к топ-2, поскольку в нем есть только 4 или 3 тега, которые есть у Questio1. ......

Так что мой вопрос в том, как спроектировать базу данных и быстро найти вопросы, связанные с вопросом 1. Большое спасибо.

Ответы [ 3 ]

9 голосов
/ 29 октября 2008

Возможно что-то вроде:

select qt.question_id, count(*)
from   question_tags qt
where  qt.tag in
( select qt2.tag
  from   question_tags qt2
  where  qt2.question_id = 123
)
group by qt.question_id
order by 2 desc
3 голосов
/ 29 октября 2008

Если вы можете гарантировать отсутствие дубликатов тегов для вопроса, вы можете сделать следующее:

SELECT
     QT2.question_id,
     COUNT(*) AS cnt
FROM
     Question_Tags QT1
INNER JOIN Question_Tags QT2 ON QT2.tag = QT1.tag AND QT2.question_id <> QT1.question_id
WHERE
     QT1.question_id = @question_id
GROUP BY
     QT2.question_id
ORDER BY
     cnt DESC

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

0 голосов
/ 29 октября 2008

Не совсем уверен, что вы имеете в виду, но на странице тегов перечислены теги в порядке популярности (как в количестве тегов).

Редактировать: это о SO или о вашем собственном приложении? Если речь идет о вашем собственном приложении, удалите тег SO, поскольку он вводит в заблуждение.

Edit2: Я бы сказал что-то вроде:

SELECT * FROM `questions` WHERE `tag` LIKE '%tagname%' OR (looped for each tag) LIMIT 5,0

Где 5 - это максимальный результат, который вы хотите вернуть (хотя бы для оптимизации). Возможно, не лучшее решение, но я видел, как оно работает.

Вы также можете попробовать LIKE совпадение, используя заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...