SQL JOIN, когда пустая ссылка все еще показывает строку - PullRequest
0 голосов
/ 11 октября 2019

У меня есть 2 таблицы:

пациент:

| patientid | name  | address |
|    45     | jelle | adres 2 |
|    23     | piet  | adres 6 |
|    11     | kees  | adres 4 |

повестка дня:

| agendaid | patientid | datum      | time    | 
|    1     |     45    | 2020-05-12 |  12:05  |
|    2     |     45    | 2020-07-11 |  16:02  |
|    3     |     11    | 2020-02-10 |  10:35  |

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

SELECT * FROM patient LEFT JOIN agenda ON patient.patientid = agenda.patientid WHERE agenda.datum >= CURDATE()

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

Желаемый результат должен быть следующим:

| patientid | name  | address | agendaid | patientid |   datum    | time  |
|    45     | jelle | adres 2 |    2     |    45     | 2020-07-11 | 16:02 | 
|    23     | piet  | adres 6 |          |           |            |       |
|    11     | kees  | adres 4 |    3     |    11     | 2020-02-10 | 10:35 |

Кто-нибудь знает, как этого добиться? Я создал SQL fiddle для вас, ребята, чтобы проверить! http://sqlfiddle.com/#!9/6eecc4/1

Как вы можете видеть, он возвращает несколько строк для каждого пациента, когда у него есть несколько назначений, и не возвращает пациентов, у которых нет назначений в будущем.

1 Ответ

2 голосов
/ 11 октября 2019

Необходимо переместить условие фильтрации в предложение ON. В противном случае вы превращаете внешнее соединение во внутреннее соединение:

SELECT p.*, a.*
FROM patient p LEFT JOIN
     agenda a
     ON p.patientid = a.patientid AND a.datum >= CURDATE();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...