Php SQL在没有联接关系时返回左表
我有以下查询,它返回帖子/文章数据和注释(如果有)。但是,如果没有对帖子发表评论,则不会返回任何内容,即使是帖子也不会返回任何内容,因为(我认为)comments表中没有连接关系。如果没有注释,则不会创建具有post ID的行 谁能解释一下我如何在一次查询中获得帖子数据和所有相关评论 问题是:-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
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表中删除一次?