Php SQL在没有联接关系时返回左表

Php SQL在没有联接关系时返回左表,php,mysql,sql,database,phpmyadmin,Php,Mysql,Sql,Database,Phpmyadmin,我有以下查询,它返回帖子/文章数据和注释(如果有)。但是,如果没有对帖子发表评论,则不会返回任何内容,即使是帖子也不会返回任何内容,因为(我认为)comments表中没有连接关系。如果没有注释,则不会创建具有post ID的行 谁能解释一下我如何在一次查询中获得帖子数据和所有相关评论 问题是:- SELECT * FROM posts LEFT OUTER JOIN comments ON posts.ID = co

我有以下查询,它返回帖子/文章数据和注释(如果有)。但是,如果没有对帖子发表评论,则不会返回任何内容,即使是帖子也不会返回任何内容,因为(我认为)comments表中没有连接关系。如果没有注释,则不会创建具有post 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

因为您有
LEFT-OUTER-JOIN
,所以当
注释时,您将从左侧表和右侧的关联行中获取所有内容,或者
NULL
如果
WHERE子句上没有。您有谓词
comments.comment\u approved=1
哪个
false
。comment\u approved
NULL
(不关联)


和comments.comment\u approved=1
移动到联接条件。

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

理解查询处理器如何处理外部(左/右/全)联接和where子句很重要

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

此结果集id根据join on子句中表示的谓词(条件)进行筛选,并作为此构造过程的一部分进行处理仅当有行时才适用。如果不存在匹配行,则仍将包含内侧的匹配行,并用空值替换外侧的任何列


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

是否有更好的方法来执行此操作,以便我仅检索项目数据f从posts表中删除一次?