这让我感到困惑,即使表movie_image在列 mi.filename 中没有任何NULL值,我也会为此查询获取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
答案 0 :(得分:4)
左连接将从第一个表(电影)中获取所有行,并尝试与第二个表(movie_publications)匹配。如果不可能插入NULL列而不是第二个表的列。
如果你不希望发生这种情况,你应该使用INNER JOIN。
更新:您在评论中说电影可以有或没有发布,但总会有图像,所以您可以按如下方式重写查询。如果您不完全确定所有电影都有图像,您也可以使用LEFT JOIN for 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
答案 1 :(得分:1)
LEFT JOIN返回左表中的所有行,即使右表中没有匹配项,而NULL表示不匹配。
答案 2 :(得分:1)
如果我找到你,那正是LEFT JOIN
的用途:甚至为“不匹配的连接”得到结果。
您的查询遍历movies
并为每一行至少发出一个结果行,即使其他表中没有“匹配的合作伙伴”。