【问题标题】:MYSQL, get both matching and null dataMYSQL,获取匹配和空数据
【发布时间】:2026-01-17 07:10:01
【问题描述】:

我有三张桌子

表_1:车辆

id name
-------
1  Honda
2  Ferrari
3  wagon

表_2:extra_details

ID        Detail
------------------------
1          GPS
2          CAMERA
3          Tracking System

Table_3:vehcile_extras

vehicle_id      extra_detail_id 
--------------------------
1                2
1                3
3                2


现在一辆车可能有不止 1 个额外的东西,比如 GPS、跟踪系统等,所以我创建了 1 个额外的东西 用于存储带有车辆 id 和 extra_detail_id 的东西的表

我想要所有车辆数据,如果某些车辆有额外的详细信息,我会显示那些用逗号分隔的数据(如果不为空)
我的查询

我的查询:

  SELECT v.* , GROUP_CONCAT(e.name SEPARATOR ', ') as additional_details FROM vehicles v 
  left join vehcile_extras ve on ve.vehicle_id = v.id
  left join extra_details e on FIND_IN_SET(ve.extra_detail_id, e.id)

结果类似,

id     name     additional_details 
----------------------------------
1      Honda    CAMERA,Tracking System
3      wagon    CAMERA

我想要这样的

id     name     additional_details 
----------------------------------
1      Honda    CAMERA,Tracking System
2      Ferrari  null
3      wagon    CAMERA

我知道我可以使用 UNION ALL 实现这一点,但我想知道是否有任何其他技巧可以在没有联合的情况下获取所有数据?

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    你可能需要一个合适的组

      SELECT  v.id, v.name , GROUP_CONCAT(e.name SEPARATOR ', ') as additional_details 
      FROM vehicles v 
      left join vehcile_extras ve on ve.vehicle_id = v.id
      left join extra_details e on FIND_IN_SET(ve.extra_detail_id, e.id)
      GROUP BY  v.id, v.name 
    

    或者也避免 FIND_IN_SET

     SELECT v.id, v.name , GROUP_CONCAT(e.name SEPARATOR ', ') as additional_details 
     FROM vehicles v 
     left join vehcile_extras ve on ve.vehicle_id = v.id
     left join extra_details e on ve.extra_detail_id =  e.id
     GROUP BY  v.id, v.name 
    

    【讨论】:

    • 谢谢,你能解释一下这个小组是如何解决这个问题的吗?
    • 因为使用没有 group by 的聚合函数会产生不可预测的结果并且不会返回空行 .. .. mysql
    • 兄弟,你知道这个问题的解决方法吗? *.com/questions/61523296/…