我们可能会在StackOverflow网站上用多个标签标记一个问题,我想知道如何找出与常见标签最相关的问题。
假设我们在数据库中有100个问题,每个问题都有几个标签。假设用户正在浏览特定问题,我们希望系统在页面上显示相关问题。相关问题的标准是它们有最常见的标签。
例如: 问题1标有AAA,BBB,CCC,DDD,EEE。
问题2与前1相关,因为它也包含所有这5个标签。 问题3与前2相关,因为它只有Questio1有4或3个标签。 ......
所以我的问题是如何设计数据库并快速找出与问题1相关的问题。非常感谢你。
答案 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
匹配。