簡體   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