2013-03-13 52 views
2

我有下面的查詢,它返回關聯的文章/文章數據和註釋。但是,如果沒有評論已發佈的任何內容都不會返回,因爲(我認爲)評論表中沒有加入關係。如果沒有評論,則不會使用帖子ID創建行。當沒有連接關係時SQL返回左表

任何人都可以解釋我將如何在一個查詢中獲取發佈數據和所有相關注釋嗎?

這裏的查詢: -

 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 

回答

4

您所遇到的問題是,即使在表左側加盟,那麼你通過在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 
+0

非常感謝Alex! – KryptoniteDove 2013-03-13 13:43:16

+0

有沒有更好的方法來做到這一點,以便我只從文章表中檢索文章數據一次? – KryptoniteDove 2013-03-13 13:47:07

2

因爲你有LEFT OUTER JOIN你會從左手錶和相關權的行或NULL得到的所有,如果有任何。在WHERE clause你有預測comments.comment_approved = 1其中falsecomments.comment_approvedNULL(不相關)。

AND comments.comment_approved = 1移動到JOIN狀態。

0

重要的是要明白是怎麼曲外部(左/右/滿)連接和where子句中的處理器函數。

對於每個連接,查詢處理器創建一個包含連接結果的臨時結果集(表)。新表中的數據將與當前臨時結果集包含的內容,From子句中提到的第一個表中的數據或最近一次加入的結果集(如果有)相結合。

根據Joins ON子句中表達的謂詞(條件)過濾此結果集id,並將其作爲此構造過程的一部分進行處理。當然,連接外側的條件)僅適用於那裏有一排的情況。如果不存在匹配的行,則內部的匹配行將被包含,並且空值將被替換爲外側的任何列。

然後,這是關鍵部分,當它完成所有連接併到達Where子句時,無論結果集是如何構造的,都會將條件應用於從所有連接生成的結果集(內/外,交叉等)。所以如果你對這個結果集中的一個列有一個條件,這個列來自一個連接外側的表,因爲該連接沒有來自外部表的匹配行,所以該行將被排除由Where子句條件。

相關問題