我有一个MySQL数据库结构,它有问题和标签,比如stackoverflow。
所以我的三张桌子是这样的:
questions:
-----------------------
id | content | asked_on
tags:
--------
id | tag
question tags:
---------------
id | qid | tid
我正在寻找一种基于questions
表中给定行的相关问题的“纯SQL”方法。
通过相关问题,我的意思是我想找到相互标签的数量。
当然我可以用PHP构建SQL查询,所以我可以做类似的事情:
COUNT xyz ..... WHERE tags.id = 17 OR tags.id = 42 OR etc..
但最后,我应该有:
qid number_of_mutual_tags
--- --------------------
42 4
12 3
25 3
...
假设参考问题有标签php,sql,mysql,javascript,html
上面的表格是用这些问题构建的:
id tags // of course this is just a representation of the three MySQL tables
--- ----
42 php,sql,mysql,javascript,xyz
12 php,sql,mysql , abc
25 sql,mysql,javascript, ijk
当然它应该有LIMIT
条款。
坦率地说,我不能做任何事情,因为我对SQL不太了解。我想我必须对JOIN
和COUNT
命令做些什么,但是怎么做?
感谢您的帮助!
答案 0 :(得分:4)
使用join
查找常用的代码。然后聚合计算它们:
select qt.qid, count(qtx.tid) as number_of_mutual_tags
from questiontags qt left outer join
questiontags qtx
on qt.tid = qtx.tid and
qtx.qid = XX
group by qt.qid
order by number_of_mutual_tags desc;
如果您要排除原始问题,可以添加条件:qt.qid <> qtx.qid
。
答案 1 :(得分:1)
所以,在你的代码中你有一些带有当前显示问题标签的数组,让它为$array
所以,你查询得到相关的问题,按相互标签的数量排序将是:
$query = 'select qid, count(*)
from questiontags
where tid in (' . implode(',', $array) . ')
group by qid
order by count(*) desc';
如果您没有此阵列,则可以将查询更改为
$query = 'select qid, count(*)
from questiontags
where tid in (select tid from questiontags where qid=' . $CURRENTQUESTIONID . ')
group by qid
order by count(*) desc';
来自@Gordon Linoff的好点 - 添加条件qid <> $CURRENTQUESTIONID