Mysql 不限制结果的内部联接

Mysql 不限制结果的内部联接,mysql,sql,database,inner-join,Mysql,Sql,Database,Inner Join,我正在慢慢地理解MySQL代码,但在很多事情上我仍然不确定。我要做的是选择线程中最近的n个条目,并包含一个标记ID列表,以引用该特定条目 我已经整理了一个查询,它在某种程度上按照预期工作,但将我返回的线程列表限制为只包含与它们相关联的标记的条目 SELECT th.thread_id,owner_id,message,time,tag_name FROM threads th INNER JOIN tag_thread_xref ttx ON th

我正在慢慢地理解MySQL代码,但在很多事情上我仍然不确定。我要做的是选择线程中最近的n个条目,并包含一个标记ID列表,以引用该特定条目

我已经整理了一个查询,它在某种程度上按照预期工作,但将我返回的线程列表限制为只包含与它们相关联的标记的条目

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以使其正常工作?

使用
左连接
不排除没有标记的线程。当然,对于没有标记的任何线程,标记名都将为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 ? 
如果您想要每个线程的标记“列表”,则可以使用如下方式:

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 ? 

谢谢,@EkoostikMartin,这就成功了。我必须研究左/右/外部/内部联接查询之间的差异。如果你把这个作为一个答案贴出来,我可以接受。这就成功了,谢谢!如果一个特定线程有多个标记,我希望它会返回一个tag_name值数组。相反,它为线程上的每个标记创建一个单独的数组元素。有什么方法可以调整吗?我认为如果不简单地循环检查结果,就无法做到这一点。您可以使用
GROUP\u CONCAT()
获得一个逗号分隔的列表。没关系,我只做一个单独的查询来选择标记。我不会用这个特定的搜索轮询数据库,所以不会有任何问题。