繁体   English   中英

没有连接关系时,SQL返回左表

[英]SQL return left table when no join relationship

我有以下查询,该查询返回文章/文章数据和注释(如果有)。 但是,如果未对帖子发表任何评论,则因为该帖子(我认为)在评论表中没有联接关系,所以即使帖子也不会返回任何内容。 如果没有评论,则不会使用帖子ID创建任何行。

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

查询如下:-

        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

您遇到的问题是,即使表保持联接状态,您也要在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

因为您有LEFT OUTER JOIN您将从左侧表中获取所有内容,而从右侧获取相关的行;如果没有,则将获取NULL WHERE clause您有谓词comments.comment_approved = 1 ,当comments.comment_approvedNULL (不相关)时,该谓词comments.comment_approved = 1 false

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

重要的是要了解外部(左/右/全)联接和where子句的查询处理器的功能。

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

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

然后,这是关键部分,当它完成所有联接并到达Where子句时,在那里的条件将应用于所有联接生成的结果集,而不管结果集的构造方式如何(内部/外部,十字架等)。 因此,如果您在此结果集中的某个列上有一个条件,该条件来自联接外侧的表,并且该联接中有空值,因为该联接没有外部表中的匹配行,则该行将被排除通过Where子句条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM