'双重加入'嵌套的MySQL查询?

时间:2017-07-05 20:26:05

标签: mysql join

作为一名初学者,我现在已经挣扎了几个小时,非常感谢任何帮助:D

我有3张桌子:

threads (id, title)
tags (id, name) 
tag_thread (thread_id, tag_id)

以下工作代码返回最近100个线程中最常用的5个标记(名称):

select ta.name
from tags ta
join tag_thread tt on tt.tag_id = ta.id
join (select * from threads order by id desc limit 100) th on tt.thread_id = th.id
group by ta.name
order by count(ta.name) desc
limit 5

问题:鉴于有一个$ tagId,我怎么必须更改为查询以过滤结果,以便只显示那些标签,这些标签连接到使用带有$ tagId的标签的线程?

非常感谢!

3 个答案:

答案 0 :(得分:1)

如果是我,我会对问题略有不同。这应该提供更快的性能,并且在我看来更容易阅读:

SELECT * FROM (
  SELECT ta.name, COUNT(ta.name) AS tag_count
  FROM threads th
  JOIN tag_thread tt
    ON tt.tag_id = th.id
  JOIN tags ta
    ON ta.id = tt.thread_id
  GROUP BY ta.name
  ORDER BY th.id DESC LIMIT 100
)
ORDER BY tag_count DESC LIMIT 5

ORDER BY子句中删除连接和聚合中的子选择通常是个好主意。如果你在ta.name上有一个索引,它将在你的查询中被忽略,并且无论如何都会执行全表扫描。

我看到了你的糊盒,但我并不完全相信我明白你要做什么。如果我误解了,请在下面发表评论。

答案 1 :(得分:0)

尝试在“group by”之前添加where子句:WHERE ta.id IS NOT NULL。

请参阅:Not equal <> != operator on NULL

答案 2 :(得分:0)

如果我理解正确,我建议您创建一个临时表来存储具有您感兴趣的标签的线程

    CREATE TEMPORARY TABLE tmp_threads AS
    SELECT distinct tt.thread_id
    FROM tag_thread tt
    WHERE tt.tag_id IN (123,46,12,121)
-- (put tag ids in above query)

接下来,您将查询更改为此类

select ta.name
from tags ta
join tag_thread tt on tt.tag_id = ta.id
join tmp_threads th on tt.thread_id = th.id
group by ta.name
order by count(ta.name) desc
limit 5