我正在慢慢搞清楚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来使其工作?
答案 0 :(得分:1)
使用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 ?