【问题标题】:SQL return left table when no join relationship没有连接关系时SQL返回左表
【发布时间】:2026-01-13 06:20:02
【问题描述】:

我有以下查询,它返回帖子/文章数据和 cmets(如果有的话)。但是,如果没有为某个帖子创建 cmets,则即使该帖子也不会返回任何内容,因为(我认为)cmets 表中没有连接关系。如果没有 cmets,则不会使用帖子 ID 创建行。

谁能解释我如何在一个查询中获取帖子数据和所有相关的 cmets?

这是查询:-

        SELECT * FROM posts
                LEFT OUTER JOIN comments
                ON posts.ID = comments.comment_post_id
            WHERE posts.ID = 8 
                AND posts.post_type = 'post' 
                AND posts.post_status = 'publish'
                AND comments.comment_approved = 1
            ORDER BY comments.comment_date_gmt DESC

【问题讨论】:

    标签: php mysql sql database phpmyadmin


    【解决方案1】:

    因为您有LEFT OUTER JOIN,所以您将从左侧表格和右侧的相关行或NULL(如果没有)获得所有信息。在WHERE clause 上,当comments.comment_approvedNULL(未关联)时,您有谓词comments.comment_approved = 1 false

    AND comments.comment_approved = 1 移至 JOIN 条件。

    【讨论】:

      【解决方案2】:

      您遇到的问题是,即使表是左连接的,您也会在 where 子句中过滤:

                      AND comments.comment_approved = 1
      

      为了完成这项工作,一种选择是:

       SELECT * FROM posts
                  LEFT OUTER JOIN comments
                  ON posts.ID = comments.comment_post_id
                  AND comments.comment_approved = 1
              WHERE posts.ID = 8 
                  AND posts.post_type = 'post' 
                  AND posts.post_status = 'publish'
              ORDER BY comments.comment_date_gmt DESC
      

      或其他

       SELECT * FROM posts
                  LEFT OUTER JOIN comments
                  ON posts.ID = comments.comment_post_id
              WHERE posts.ID = 8 
                  AND posts.post_type = 'post' 
                  AND posts.post_status = 'publish'
                  AND (comments.comment_approved IS NULL OR comments.comment_approved = 1)
              ORDER BY comments.comment_date_gmt DESC
      

      【讨论】:

      • 有没有更好的方法来做到这一点,以便我只从帖子表中检索文章数据一次?
      【解决方案3】:

      重要的是要了解查询处理器如何为外部(左/右/全)连接和 where 子句发挥作用。

      对于每个连接,查询处理器都会创建一个包含连接结果的临时结果集(表)。新连接的表中的数据与当前临时结果集包含的任何内容、From 子句中提到的第一个表中的数据或前一个连接的结果集(如果有的话)结合在一起。

      此结果集 id 根据 Joins ON 子句中表达的谓词(条件)过滤,作为此构造过程的一部分进行处理。当然,连接外侧的条件)仅适用于那里有一行的情况。如果不存在匹配行,则仍然包含来自内侧的匹配行,并且将用空值替换来自外侧的任何列。

      然后,这是关键部分,当它完成所有连接并到达 Where 子句时,那里的条件将应用于从所有连接生成的结果集,而不管结果集是如何构造的(内部/外,十字架等)。因此,如果您对该结果集中的列有条件,该条件来自连接外侧的表,其中包含空值,因为该连接没有来自外部表的匹配行,那么该行将被排除由 Where 子句条件。

      【讨论】:

        最近更新 更多