Соединение влево приводит к появлению нулевых строк для столбца без нулевых строк - PullRequest
1 голос
/ 28 сентября 2011

Это меня смущает, я получаю NULL столбцы для этого запроса, хотя таблица movie_image не имеет значений NULL в столбце mi.filename .

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

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011

Левое объединение возьмет все строки из первой таблицы (фильмы) и попытается сопоставить со второй таблицей (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
1 голос
/ 28 сентября 2011

Если я вас правильно понял, это именно то, для чего LEFT JOIN: для получения результата даже для "несоответствующих объединений".

Ваш запрос проходит через movies и выдает по крайней мере одну строку результата для каждой строки, даже если в других таблицах нет «соответствующего партнера».

1 голос
/ 28 сентября 2011

LEFT JOIN возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений, а NULL - для совпадений нет.

...