INNER JOIN不限制结果

时间:2014-01-29 22:39:27

标签: mysql sql database inner-join

我正在慢慢搞清楚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来使其工作?

1 个答案:

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