2011-09-28 61 views
1

這讓我感到困惑,即使表movie_image沒有任何NULL值列mi.filename我收到此查詢的NULL列。左連接導致空列無空行

SELECT m.*, mi.filename, COUNT(p.movieid) AS publicationsCount 
       FROM movies m 
      LEFT JOIN (movie_publications p, movie_image mi) 
        ON (m.movieid = p.movieid 
         AND 
         p.movieid = mi.movieid) 
       GROUP BY m.movieid 

回答

4

左連接將從第一個表(電影)中獲取所有行,並嘗試與第二個表(movie_publications)匹配。如果不可能,將插入NULL列而不是第二個表的列。

如果你不希望發生這種情況,你應該使用INNER JOIN。

UPDATE:你在評論中說電影可以有或沒有發表,但總會有圖像,所以你可以按如下方式重寫查詢。如果你不完全確定所有電影都有圖像,你也可以使用LEFT JOIN作爲movie_image。

SELECT m.*, mi.filename, COUNT(p.movieid) AS publicationsCount 
    FROM movies m 
    LEFT JOIN movie_publications p 
     ON (m.movieid = p.movieid) 
    INNER JOIN movie_image mi 
     ON (m.movieid = mi.movieid) 
    GROUP BY m.movieid 
+0

謝謝你有道理,所以我只需要正常加入movie_image與左連接? –

+0

你沒有提到movie_image表,無論如何,如果你想顯示所有的電影,有或沒有圖像是一個左加入,如果你想只顯示帶圖像的電影,那麼它是一個內部聯接。 – stivlo

+0

我需要顯示有/沒有出版物的電影,永遠不會有沒有電影圖像的實例。 –

1

的LEFT JOIN返回的所有行左表中,即使是在正確的表中沒有火柴,NULL對於沒有匹配。

1

如果我找到你的話,LEFT JOIN的確適用於:即使是「非匹配連接」也能得到結果。

您的查詢通過movies行走,併爲每行發出至少一個結果行,即使其他表中沒有「匹配夥伴」。