[英]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.