我有三个表 Table_1 : 车辆
id name
-------
1 Honda
2 Ferrari
3 wagon
表2:extra_details
ID Detail
------------------------
1 GPS
2 CAMERA
3 Tracking System
表3:车辆的附加物
vehicle_id extra_detail_id
--------------------------
1 2
1 3
3 2
现在,一辆车可能有超过1个额外的东西,如GPS,跟踪系统等,所以我创建了1个extratable存储这些东西的车辆ID和extra_detail_id。 我想要所有车辆的数据,如果一些车辆有额外的细节,我用逗号隔开来显示,如果不是null的话 我的疑问
我的查询。
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 ,但我想知道,如果有任何其他的技巧,以获得所有的数据没有工会?
解决方案:
可能是你需要一个适当的组由
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