MYSQL, получить как совпадающие, так и нулевые данные - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть три стола

Таблица_1: Транспортные средства

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

Таблица_2: extra_details

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

Таблица_3: vehcile_extras

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

Теперь у одного транспортного средства может быть более 1 дополнительных вещей, таких как GPS, система слежения и т. Д. c, поэтому я создаю 1 дополнительную таблицу для хранения этих вещей с идентификатором транспортного средства и 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, но я хочу знать, есть ли другой способ получить все данные без объединения?

1 Ответ

0 голосов
/ 23 апреля 2020

Скажите, вам нужна правильная группа

  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 
...