Как выбрать с помощью INNER JOIN, предоставляя связанные, но также и несвязанные записи

#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. Да, для этого и нужны «внешние соединения».