#mysql #sql #left-join #sql-null
#mysql #sql #левое соединение #sql-null
Вопрос:
У меня есть эти две таблицы:
Пользователи
---- -------
| id | name |
---- -------
| 1 | John |
---- -------
| 2 | Peter |
---- -------
| 3 | Lucas |
---- -------
Подарки
---- -------- ---------- ----------
| id | boy_id | type | quantity |
---- -------- ---------- ----------
| 1 | 1 | clothing | 3 |
---- -------- ---------- ----------
| 2 | 2 | toy | 1 |
---- -------- ---------- ----------
| 3 | 2 | clothing | 2 |
---- -------- ---------- ----------
И я пытаюсь запросить «подарки, полученные мальчиками», что-то вроде этого:
------- ---------- ----------
| name | type | quantity |
------- ---------- ----------
| John | clothing | 3 |
------- ---------- ----------
| Peter | toy | 1 |
------- ---------- ----------
| Peter | clothing | 2 |
------- ---------- ----------
| Lucas | "" | 0 |
------- ---------- ----------
Но я просто знаю, как получить связанные данные с помощью такого запроса:
SELECT u.name, g.type, g.quantity FROM gifts g INNER JOIN users u ON g.boy_id = u.id
Итак, поскольку Лукаса нет в таблице подарков, я получаю следующее:
------- ---------- ----------
| name | type | quantity |
------- ---------- ----------
| John | clothing | 3 |
------- ---------- ----------
| Peter | toy | 1 |
------- ---------- ----------
| Peter | clothing | 2 |
------- ---------- ----------
Итак, как мне включить Питера в результат, заполнив тип и количество символом «» и нулем, если мальчик не получил подарок?
Ответ №1:
Вы могли бы просто left join
:
SELECT u.name, g.type, COALESCE(g.quantity, 0) quantity
FROM users u
LEFT JOIN gifts g ON g.boy_id = u.id
Комментарии:
1. Да, для этого и нужны «внешние соединения».