MySQL左连接查询问题:获取左表全部车辆及加油总量(含未加油车辆)
修正左连接查询以获取所有车辆的加油统计
嘿,我来帮你搞定这个查询问题~咱们先拆解下你原来的代码哪里出了问题,再给出修正方案:
问题分析
你当前的查询有三个关键问题:
- 主表搞反了:左连接需要以
tbl_vehicle(你要保留全部记录的表)作为主表,而你现在把tbl_direct_fuel放在了前面,导致只有有加油记录的车辆才会被返回。 - 连接字段错误:
tbl_direct_fuel里关联的字段是vehicle_id,不是你写的vehicle,这个拼写错误会导致关联失效。 - 空值未处理:没有加油记录的车辆,
SUM(fuel_qty)会返回NULL,而不是你想要的0。
修正后的查询构造器代码(假设使用Laravel风格)
DB::table('tbl_vehicle') ->leftJoin('tbl_direct_fuel', 'tbl_vehicle.vehicle_id', '=', 'tbl_direct_fuel.vehicle_id') ->select( 'tbl_vehicle.reg_no', DB::raw('COALESCE(SUM(tbl_direct_fuel.fuel_qty), 0) as total') ) ->groupBy('tbl_vehicle.reg_no') ->get();
对应的原生SQL版本
如果你需要原生SQL,也可以这样写:
SELECT v.reg_no, COALESCE(SUM(df.fuel_qty), 0) AS total FROM tbl_vehicle v LEFT JOIN tbl_direct_fuel df ON v.vehicle_id = df.vehicle_id GROUP BY v.reg_no;
关键修正点说明
- 调整主表顺序:将
tbl_vehicle作为左连接的左表,确保所有车辆记录都被保留,哪怕没有匹配的加油数据。 - 修正关联条件:用正确的
vehicle_id字段完成两表关联,保证数据匹配准确。 - 处理空值:使用
COALESCE函数(MySQL也可以用IFNULL)将SUM返回的NULL转换为0,满足未加油车辆显示0的需求。 - 明确分组字段:指定分组字段为
tbl_vehicle.reg_no,避免因字段歧义导致的错误。
预期输出
执行修正后的查询后,就能得到你想要的结果:
+--------+----------+ | reg_no | total | +--------+----------+ | ABC | 22 | | DEF | 45 | | GHI | 15 | | JKA | 0 | | LMN | 0 | | OPQ | 0 | +--------+----------+
内容的提问来源于stack exchange,提问作者MCIT Trends
相关产品推荐
相关产品推荐

