SQL две таблицы LEFT JOIN с несколькими условиями WHERE из обеих таблиц

Я не знаю, что может быть не так с моим запросом, но последние несколько часов я сильно тер голову. Может быть, кто-то может помочь, указав, что не так для меня.

Я пытаюсь получить совпадающие элементы из таблицы один и присоединиться к таблице два с несколькими условиями из обеих таблиц с запросом ниже, но он продолжает возвращать пустые поля или строки, даже когда я уверен, что есть совпадения:

SELECT s.name, s.gender, s.level, s.program, s.registered
     , s.available, s.dispic, c.staff, c.level, c.year, c.period
FROM students s
LEFT JOIN allots c ON s.level=c.level AND s.registered=1 AND s.available=0
WHERE c.staff=:staff
  AND c.year=:year
  AND c.period=:period
  AND c.level=:level
  AND c.subject:subject
ORDER BY s.name DESC;

Все усилия оказались ошибочными.


person Community    schedule 12.10.2016    source источник
comment
Было бы полезно, если бы вы предоставили образцы данных вместе с результирующим выводом, который, учитывая образцы данных, вы ожидаете, что ваш SQL вернет.   -  person MJH    schedule 12.10.2016
comment
В дополнение к комментарию @MJH, не могли бы вы предоставить скрипт SQL?   -  person halfer    schedule 12.10.2016


Ответы (1)


Если вы ограничиваете правую часть левого соединения с помощью предложения where, вы фактически превращаете его во внутреннее соединение (поскольку вы устраняете пустые строки, возвращаемые с правой стороны) (дополнительную информацию см. В разделе этот вопрос). Вместо применения условий в предложении where переместите их в предикаты соединения.

Это должно быть то, что вы хотите:

SELECT s.name, s.gender, s.level, s.program, s.registered
     , s.available, s.dispic, c.staff, c.level, c.year, c.period
FROM students s
LEFT JOIN allots c ON s.level=c.level 
  AND c.staff=:staff
  AND c.year=:year
  AND c.period=:period
  AND c.level=:level
  AND c.subject=:subject
WHERE s.registered=1 AND s.available=0
ORDER BY s.name DESC;
person jpw    schedule 12.10.2016
comment
Большое спасибо за поддержку, ибо я не просто был спасен, но я также узнал кое-что, что в соединениях, из того, как решение, условия на второй таблице должны быть на предложении ON, где как те из первая таблица переходит в предложение WHERE, если только я прав. Хотя меня поправят! Тем не менее, я учусь в школе, поэтому я реализую это и отчитаюсь, потому что я помню, как пробовал несколько решений, подобных тому, что предложил @invissible, но безуспешно. Я очень надеюсь, что это работает как шарм, так как я не пробовал это решение. Еще раз спасибо. - person ; 12.10.2016
comment
Пожалуйста, извините, но это тоже не сработало. Я имею в виду, что он вообще ничего не делает, даже не выдает ошибку. Так что может быть причиной? - person ; 13.10.2016
comment
@DerickMarfo Не видя некоторых примеров данных, я действительно не могу сказать, что может быть не так. Запрос должен подойти для проблемы, которую вы описали. Возможно, вы могли бы отредактировать свой вопрос и добавить некоторые образцы данных и ожидаемый результат. - person jpw; 13.10.2016
comment
Прежде всего, я должен извиниться перед вами за предыдущий комментарий. Мне жаль говорить, что ошибка была связана с массивом в моем скрипте, который имел неопределенный ключ. еще раз очень извиняюсь!!! Ваше решение работает как шарм, как я и ожидал. Это идеальное и надежное решение, а также полезное руководство. Спасибо большое!!! - person ; 15.10.2016
comment
Извините, я добавил @jpw в комментарий выше, но, к сожалению, по какой-то причине он был опущен. Большое спасибо. - person ; 15.10.2016
comment
Однако есть ли альтернатива в отношении скорости или преимуществ? Например, использование WHERE NOT EXISTS для того же запроса. - person ; 15.10.2016