MySQL LEFT JOIN - значения могут быть NULL - PullRequest
2 голосов
/ 07 марта 2012

Я изменяю оператор MySQL, но у меня возникли некоторые проблемы с LEFT JOIN и пустыми строками.На данный момент у меня есть:

SELECT cs.case_id, cs.child_firstname, gu.*
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'

Этот запрос работает нормально, пока есть запись в таблице "tblguardians", но LEFT JOIN возвращает NULL, если записи нет - поэтому запись isn 't возвращается, когда я перебираю результаты в PHP.

Есть ли способ вернуть поля из "tblcases", независимо от того, имеет ли "tblguardians" связанный результат?Я думаю, что я прочитал слишком много страниц Google, чтобы получить гораздо больше информации!

Ответы [ 4 ]

10 голосов
/ 07 марта 2012

Помещение условия в объединенную таблицу в предложении WHERE фактически делает это присоединением к INNER JOIN.
Чтобы этого не произошло, вам нужно добавить второе условие в LEFT JOIN:

 SELECT cs.case_id, cs.child_firstname, gu.*
   FROM tblcases cs 

        LEFT JOIN tblguardians gu
        ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%sally%' /* <- this line was moved up from WHERE */

  WHERE cs.child_firstname = '%craig%' 
4 голосов
/ 07 марта 2012

Вы должны немного реструктурировать свой запрос.Помещение условия в предложение WHERE будет всегда удалять целые строки .Поскольку запись tblguardians может быть нулевой из-за LEFT JOIN, вы не можете сравнивать ее со столбцом firstname, не удаляя всю строку.tblguardians, вам нужно переместить ваше условие для этой таблицы в предложение ON в JOIN.При этом будет удален (установлен в NULL) результат строки из этой таблицы, а не вся строка.

SELECT cs.case_id, cs.child_firstname, gu.*
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu
ON cs.case_id = gu.case_id  AND gu.firstname LIKE '%sally%'
WHERE cs.child_firstname = '%craig%'
1 голос
/ 07 марта 2012

Вы фильтруете по gu;если в таблице tblguardians нет записей, результаты не будут соответствовать этому предложению WHERE.

0 голосов
/ 07 марта 2012

Оператор LEFT JOIN позволяет показывать только результаты, где есть правый пустой столбец. Если вы хотите показать оба пустых столбца, вы должны использовать FULL OUTER JOIN. Таким образом, с методом у вас будет левый и правый пустой столбец.

SELECT cs.case_id, cs.child_firstname, gu.*
FROM tblcases AS cs 
FULL OUTER JOIN tblguardians AS gu
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...