如何在MySQL中使用tag_ids获取相关问题?

时间:2014-02-09 22:50:49

标签: mysql sql

我有一个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不太了解。我想我必须对JOINCOUNT命令做些什么,但是怎么做?

感谢您的帮助!

2 个答案:

答案 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