我有两个表,一个包含车辆数据,另一个包含燃料数据,如下所示:
tbl_vehicle
+------------+--------+
| vehicle_id | reg_no |
+------------+--------+
| 1 | ABC |
| 2 | DEF |
| 3 | GHI |
| 4 | JKA |
| 5 | LMN |
| 6 | OPQ |
+------------+--------+
tbl_direct_fuel
+---------+------------+----------+------------+
| fuel_id | vehicle_id | fuel_qty | date |
+---------+------------+----------+------------+
| 100 | 1 | 10 | 2019-10-01 |
| 101 | 1 | 12 | 2019-10-02 |
| 102 | 2 | 20 | 2019-10-03 |
| 103 | 3 | 15 | 2019-10-03 |
| 104 | 2 | 25 | 2019-10-04 |
+---------+------------+----------+------------+
我试图获取左表的所有记录以及右表的相关记录。在查询之后使用。
select("reg_no,sum(fuel_qty) as total")
->from('tbl_direct_fuel')
->join('tbl_vehicle', 'tbl_direct_fuel.vehicle=tbl_vehicle.vehicle_id', 'left')
->group_by ('reg_no')
以上代码仅显示以下输出。
+--------+----------+
| reg_no | total |
+--------+----------+
| ABC | 22 |
| DEF | 45 |
| GHI | 15 |
+--------+----------+
但我需要如下所有未加燃料的车辆。
期望的输出
+--------+----------+
| reg_no | total |
+--------+----------+
| ABC | 22 |
| DEF | 45 |
| GHI | 15 |
| JKA | 0 |
| LMN | 0 |
| OPQ | 0 |
+--------+----------+
最佳答案
您可以反转left join
中的表,以便没有加油的车辆出现在结果集中(事实上,您的left join
允许加油没有车辆,这看起来不像一个相关的用例)。
我还建议在列名称前加上它们来自的表,以避免歧义。
最后,要为没有加油的车辆返回 0
(而不是 null
),您可以使用 coalesce()
。
select("tbl_vehicle.reg_no, coalesce(sum(fuel_qty), 0) fuel_qty")
->from('tbl_vehicle')
->join('tbl_direct_fuel', 'tbl_direct_fuel.vehicle = tbl_vehicle.vehicle_id', 'left')
->group_by ('tbl_vehicle.vehicle_id')
关于MySQL 用 Join 列出左表中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464261/