MySQL - сбой LEFT JOIN при добавлении предложения WHERE - PullRequest
1 голос
/ 30 января 2011

У меня есть 4 таблицы следующим образом; SCHEDULES , SCHEDULE_OVERRIDE , SCHEDULE_LOCATION_OVERRIDES и LOCATION

Мне нужно вернуть ВСЕ строки из всех таблиц, так что этот запрос выполняетсяработает нормально, добавляя значения NULL для любых значений, которые отсутствуют:

SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
ORDER BY s.id, so.id, slo.id, l.id

Затем мне нужно ограничить результаты в поле schedule_override end_date.Моя проблема в том, что как только я это сделаю, результаты для таблицы SCHEDULE вообще не будут возвращены.Мне нужно, чтобы все расписания были возвращены, даже если критерии переопределения end_date не выполнены.

Вот что я использую:

SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
WHERE so.end_date > '2011-01-30' OR so.end_date IS NULL
ORDER BY s.id, so.id, slo.id, l.id

Оцените любые мысли / комментарии.

С наилучшими пожеланиями, Бен.

Ответы [ 3 ]

5 голосов
/ 30 января 2011

Вы пытались вставить это в предложение ON?

SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id AND (so.end_date > '2011-01-30' OR so.end_date IS NULL))
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
ORDER BY s.id, so.id, slo.id, l.id
3 голосов
/ 30 января 2011

Это довольно распространенная ошибка с внешними объединениями.

Вам необходимо поместить все, что ограничивает объединение, в часть «ON» для этой таблицы, в противном случае вы фактически преобразуете объединение во внутреннее.

Итак, переместите предложение WHERE в этом случае во ON-часть schedule_override, и все будет в порядке.

1 голос
/ 30 января 2011

Да, когда вы покинули объединение, возможно, строка не найдена, а в результате в поле указано значение NULL.Когда вы добавляете условие в предложение WHERE, значение должно соответствовать этому условию, чего не будет, если оно равно NULL.

Это не должно быть проблемой, поскольку вы явно проверяете NULL, поэтому я не знаю, почему это условие не выполняется, если только не возвращает дату, но этадо 2011-01-30.

В любом случае, вы можете попытаться переместить условие в объединение.Это избавит от необходимости проверять NULL, хотя на самом деле это не должно иметь значения.

SELECT.....
FROM 
  schedule s 
  LEFT JOIN schedule_override so 
    ON so.schedule_id = s.id
    AND so.end_date > '2011-01-30'
  ...
...