У меня есть этот прямой запрос:
SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id)
Это возвращает все format_types, идентификаторы формата и идентификатор газеты, который у нас есть для этого формата. Однако мне нужно ограничить его только газетой_ид = х, если я сделаю это с ГДЕ, например:
SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id)
WHERE h.newspaper_id=3
Тогда я получаю только форматы, которые у нас есть в этой газете. Мне все еще нужны все форматы, независимо от того, есть ли у этой газеты.
Надеюсь, это имеет смысл. При необходимости попросите разъяснения.
Вы можете изменить запрос на
SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id)
AND h.newspaper_id=3
Это отличный пример различий в поведении запросов между критериями в предложении ON и там. Для предложения WHERE возвращаемые записи должны совпадать. Это исключает строки, которые не соответствуют match_formats, потому что номер газеты для этих строк равен NULL, а NULL!= 3.
Format_type newspaper_id
1 NULL Exclude because null != 3
1 3 Include because 3=3
1 2 Exclude because 2 !=3
Чтобы включить все типы форматов, вы хотите поместить эти критерии в условие соединения. Стандартное определение левого внешнего соединения: "Извлеките все записи из таблицы в левой части соединения и только те записи, которые соответствуют критериям соединения из таблицы в правой части соединения". Критерии присоединения должны быть в ON, а не WHERE.
SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id AND h.newspaper_id=3)
SELECT f.id, f.format_type, h.newspaper_id FROM newspapers_formats f LEFT JOIN newspapers_formats_held h ON (f.id = h.format_id) WHERE h.newspaper_id = 3 OR h.format_id IS NULL
Вам нужно поместить критерии фильтра в предложение ON. Вот так:
SELECT f.id, f.format_type, h.newspaper_id FROM newspaper_formats f LEFT JOIN newspaper_formats_held h ON (f.id = h.format_id) И h.newspaper_id = 3
Ответ Dewayne велик.
Может быть, использование отдельных будет еще лучше.