如何查找具有最常见标记的记录,例如StackOverflow中的相关问题

时间:2008-10-29 13:47:52

标签: sql database algorithm tags

我们可能会在StackOverflow网站上用多个标签标记一个问题,我想知道如何找出与常见标签最相关的问题。

假设我们在数据库中有100个问题,每个问题都有几个标签。假设用户正在浏览特定问题,我们希望系统在页面上显示相关问题。相关问题的标准是它们有最常见的标签。

例如: 问题1标有AAA,BBB,CCC,DDD,EEE。

问题2与前1相关,因为它也包含所有这5个标签。 问题3与前2相关,因为它只有Questio1有4或3个标签。 ......

所以我的问题是如何设计数据库并快速找出与问题1相关的问题。非常感谢你。

3 个答案:

答案 0 :(得分:9)

也许是这样的:

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

答案 1 :(得分:3)

如果您可以保证问题没有重复的标签,那么您可以执行以下操作:

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

如果你无法保证问题中标签的唯一性,那么Tony Andrews的解决方案就可以了。无论如何,他都会工作,但如果你能通过约束来保证唯一性,那么你应该将你的系统的性能与这种方法进行比较。

答案 2 :(得分:0)

不完全确定您的意思,但the Tags page按照受欢迎程度列出了标记(如标记数量)。

编辑:这是关于SO还是您自己的应用程序?如果它是关于您自己的应用程序,请删除SO标记,因为它会产生误导。

Edit2:我会说:

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

其中5是您要返回的最大结果(至少为某些优化)。可能不是最好的解决方案,但我可以看到它的工作原理。

您可能还想尝试使用标题进行LIKE匹配。