作为一名初学者,我现在已经挣扎了几个小时,非常感谢任何帮助: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的标签的线程?
非常感谢!
答案 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。
答案 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