![](/img/trans.png)
[英]CodeIgniter Two tables Left Join does not return Join Condition id of left table when miss in right table
[英]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_approved
为NULL
(不相关)时,该谓词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.