Многократное объединение с фильтрацией - PullRequest
0 голосов
/ 04 марта 2019

у меня 3 стола
группа

idG


студент

idS 
idG


Рейтинг

idR
idS
date

отношения 1 (группа) -∞ (студент), 1 (студент) -∞ (рейтинг)
Мне нужно выбрать все группы, где idG равен 1 (дляпример) ПРИСОЕДИНЯЙТЕСЬ Студент с ЛЕВЫМ РЕЙТИНГОМ, где дата междуЯ пытаюсь использовать такой запрос

SELECT *
FROM `group` AS g
     JOIN student
        ON g.idG = 1
    LEFT JOIN rating
        ON rating.idR = student.idS
WHERE rating.`date` between '2019-02-01' and '2019-02-28';

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

idG | idS | idR  | date|
1   | 1   | NULL | NULL|
1   | 2   | 1    | 2019-02-08|
1   | 3   | 3    | 2019-02-10|
1   | 4   | NULL | NULL|

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете поместить критерии для левой объединенной таблицы в JOIN.

SELECT grp.idG, stu.idS, rat.idR, rat.`date`
FROM student stu
JOIN `group` AS grp
  ON grp.idG = stu.idG
LEFT JOIN rating rat
  ON rat.idS = stu.idS 
 AND rat.`date` BETWEEN '2019-02-01' AND '2019-02-28'
WHERE stu.idG = 1;

С LEFT JOIN дело в том, что когда вы также хотите, чтобы те, которые не соответствуют, это критерий в WHEREПредложение для объединенной таблицы отбрасывает все несоответствия.
Так как затем отбрасывает значения NULL с правой стороны объединения.

...