Quick Left Join Question

0

У меня есть этот прямой запрос:

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

Тогда я получаю только форматы, которые у нас есть в этой газете. Мне все еще нужны все форматы, независимо от того, есть ли у этой газеты.

Надеюсь, это имеет смысл. При необходимости попросите разъяснения.

Теги:

5 ответов

4
Лучший ответ

Вы можете изменить запрос на

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
4

Это отличный пример различий в поведении запросов между критериями в предложении 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)
2
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
1

Вам нужно поместить критерии фильтра в предложение 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

0

Ответ Dewayne велик.

Может быть, использование отдельных будет еще лучше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню