mysql - INNER JOIN 不限制结果

标签 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 来使其工作?

最佳答案

使用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/

相关文章:

MySQL 选择、连接表和组/计数逗号分隔值

sql - MS-Access SQL 条件过滤困难

PHP Array POST UPDATE 只影响最后一行

MySQL 查询域名和帖子编号

java.sql.SQLException : Connection is read-only. hibernate中不允许导致数据修改的查询

mysql - Laravel 5 自定义验证 - 自定义 MySQL 查询

mysql - 如果值小于上一行,则删除下一行

mysql : Check duplicate value of a column in 3 different tables

mysql - Symfony4 - 计数查询的 Doctrine 分页性能低(634484 条记录)

sql - 近4季度数据