2016-10-12 4 views
-1

Я не знаю, что может быть неправильным с моим запросом, но я протирал себе голову в течение последних нескольких часов. Может быть, кто-то может помочь, указав на то, что неправильно для меня.SQL two table LEFT JOINs с несколькими условиями WHERE из обеих таблиц

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

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; 

Все усилия оказались неисправными.

+0

Это помогло бы, если бы вы предоставить образцы данных, а также в результате вывода, что, учитывая выборочные данные, можно было бы ожидать ваш SQL, чтобы вернуться. – MJH

+0

В дополнение к комментарию @ MJH, вы бы предоставили SQL Fiddle? – halfer

ответ

2

Если вы ограничиваете правую часть левого соединения с помощью предложения where, вы фактически меняете его на внутреннее соединение (поскольку вы устраняете нулевые строки, возвращенные с правой стороны) (для получения дополнительной информации см. this question). Вместо применения условий в предложении 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; 
+0

Большое спасибо за поддержку, поскольку я не только был спасен, но и кое-что узнал, что в Joins, из того, как это решение, условия на второй таблице должны быть в условии ON, где, как и у первая таблица переходит к предложению WHERE, если только я прав. Но я буду исправлен! Тем не менее, я в школе, поэтому я буду реализовывать его и отчитываться, потому что я помню, как пытался несколько решений, таких как то, что предлагалось, но безуспешно. Я очень надеюсь, что это работает как шарм, так как я не пробовал это решение. Еще раз спасибо. –

+0

Прошу прощения, но это тоже не сработало. Я имею в виду, что он ничего не делает, даже не делает ошибку. Так что может быть причиной? –

+0

@DerickMarfo Не видя некоторых данных примера, я действительно не могу сказать, что может быть неправильным. Запрос должен быть хорошим для проблемы, которую вы описали. Возможно, вы можете отредактировать свой вопрос и добавить некоторые примеры данных и ожидаемый результат. – jpw