2016-09-10 5 views
0

У меня есть большое соединение с несколькими таблицами, выберите, где некоторые значения являются необязательными.SQL: join выберите несколько таблиц с отсутствующей строкой

Это запрос:

В таблицах из вышеуказанного запроса, таблица с именем services_reservation со следующими столбцами (id, services_id, reservation_id) полностью разряжен в этом случае, что делает значение что я выбираю из таблицы bike_shipping_reservation NULL.

Как я могу сделать некоторые таблицы, которые я выбираю из опционального, если они пустые?

Вот SQL Fiddle с 1 пустой таблицей, вы можете увидеть результаты NULL в конце (только GROUP_CONCAT (DISTINCT g.service) должен быть NULL).

http://sqlfiddle.com/#!9/ee31b/6

Вот SQL Скрипка со все таблицами, имеющими значение в столбцах там, вы можете увидеть, что все значения возвращаются не NULL.

http://sqlfiddle.com/#!9/8bc033/34

Любые мысли?

+0

Простое правило: * Никогда * используйте запятые в 'п от'. * Всегда * используйте явный синтаксис JOIN с условиями в разделе 'ON'. –

+0

@ Gordon Linoff - Будет ли это исправлять мою проблему? – Speedwheelftw

+0

Как уже говорилось в @GordonLinoff, используйте явный синтаксис JOIN, который позволит вам определить поведение комбинации (LEFT, INNER ...). Скорее всего, вы достигнете своего результата, используя боковые соединения, где это необходимо. –

ответ

1

Используйте левое соединение, где таблицы (или строки), пустые на не совпадают

SELECT a.date_in, a.date_out, b.name, b.phone, b.birthdate, 
b.country, b.hotel, b.room_nr, b.passport_nr, c.email, 
d.size, e.name, GROUP_CONCAT(DISTINCT g.service), GROUP_CONCAT(DISTINCT  h.service) 
, GROUP_CONCAT(DISTINCT i.time), GROUP_CONCAT(DISTINCT j.location) 

FROM reservation a 
INNER JOIN rider b on a.rider_id = b.id 
INNER JOIN user c on b.user_id = c.id 
INNER JOIN bike_size d on a.bike_size_id = d.id 
INNER JOIN bike e ON d.bike_id = e.id 
LEFT JOIN services_reservation f on a.id = f.reservation_id 
INNER JOIN services g on f.services_id = g.id 
INNER JOIN bike_shipping_reservation i on a.id = i.reservation_id 
INNER JOIN bike_shipping h ON h.id = i.bike_shipping_id 
INNER JOIN bike_shipping_location j on i.bike_shipping_location_id = j.id 
where a.id = 80 
+0

Спасибо, что сделал трюк. – Speedwheelftw

Смежные вопросы