如何使用INNER JOIN进行选择,提供相关但不相关的记录

问题描述

我有这两个表:

用户

+----+-------+
| 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

因此,由于卢卡斯不在 gifts 表中,因此我得到了以下信息:

+-------+----------+----------+
| name  | type     | quantity |
+-------+----------+----------+
| John  | clothing | 3        |
+-------+----------+----------+
| Peter | toy      | 1        |
+-------+----------+----------+
| Peter | clothing | 2        |
+-------+----------+----------+

那么,如果男孩没有收到礼物,我该如何在结果中包括彼得,用“”填充类型和数量,并用零填充?

解决方法

您可以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