我正在慢慢地弄清楚 MySQL 代码,但我对很多事情仍然不确定。我想要做的是选择线程中最近的 n 个条目,并包含一个 tag_ids 列表,任何引用该特定条目。
我已经弗兰肯斯坦组合了一个查询,该查询在某种程度上按预期工作,但将我的线程列表限制为仅返回具有与其关联的标签的条目。
SELECT th.thread_id,owner_id,message,time,tag_name
FROM threads th
INNER JOIN tag_thread_xref ttx
ON th.thread_id = ttx.thread_id
INNER JOIN tags t
ON ttx.tag_id = t.tag_id
ORDER BY time DESC
LIMIT ?
显然,我可以只查询我的线程列表,然后进行第二个更简单的查询来查找哪些线程具有与其关联的标签,但如果可能的话,我希望通过一个查询来实现这一目标。有没有办法重写我的 SQL 来使其工作?
最佳答案
使用LEFT JOIN
不排除没有标签的线程。当然,对于任何没有标签的线程,tag_name 将为 NULL。
SELECT th.thread_id,owner_id,message,time,tag_name
FROM threads th
LEFT JOIN tag_thread_xref ttx
ON th.thread_id = ttx.thread_id
LEFT JOIN tags t
ON ttx.tag_id = t.tag_id
ORDER BY time DESC
LIMIT ?
如果您想要每个线程的标签“列表”,那么您可以使用 GROUP_CONCAT像这样:
SELECT th.thread_id,owner_id,message,time,
GROUP_CONCAT(DISTINCT tag_name ORDER BY tag_name) as tags
FROM threads th
LEFT JOIN tag_thread_xref ttx
ON th.thread_id = ttx.thread_id
LEFT JOIN tags t
ON ttx.tag_id = t.tag_id
GROUP BY th.thread_id,owner_id,message,time
ORDER BY time DESC
LIMIT ?
关于mysql - INNER JOIN 不限制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21444217/