You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键修正点说明

  1. 调整主表顺序:将tbl_vehicle作为左连接的左表,确保所有车辆记录都被保留,哪怕没有匹配的加油数据。
  2. 修正关联条件:用正确的vehicle_id字段完成两表关联,保证数据匹配准确。
  3. 处理空值:使用COALESCE函数(MySQL也可以用IFNULL)将SUM返回的NULL转换为0,满足未加油车辆显示0的需求。
  4. 明确分组字段:指定分组字段为tbl_vehicle.reg_no,避免因字段歧义导致的错误。

预期输出

执行修正后的查询后,就能得到你想要的结果:

+--------+----------+
| reg_no | total    |
+--------+----------+
| ABC    | 22       |
| DEF    | 45       |
| GHI    | 15       |
| JKA    | 0        |
| LMN    | 0        |
| OPQ    | 0        |
+--------+----------+

内容的提问来源于stack exchange,提问作者MCIT Trends

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:17:17