2011-09-28 106 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行走,并为每行发出至少一个结果行,即使其他表中没有“匹配伙伴”。