Първоначално ето какво измислих:
SELECT s.date, s.day, COALESCE(GROUP_CONCAT(bm.worker SEPARATOR ' '),'') as Morning,COALESCE(GROUP_CONCAT(be.worker SEPARATOR ' '),'') as Evening
FROM schedule s LEFT JOIN
block bm ON s.id = bm.schedule_id AND bm.shift=1 LEFT JOIN
block be ON s.id = be.schedule_id AND be.shift=2
GROUP BY s.date,s.day
Резултат:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris Faris
23/09/2014 Tuesday Iqbal
Резултат в Fiddle .
Както можете да видите Вечерното полесъдържа Фарис два пъти . Затова използвах две заявки и се присъединих към тези резултати. Като това:
SELECT T1.date,T1.day,COALESCE(T1.Morning,'') as Morning,COALESCE(T2.Evening,'') as Evening FROM
(SELECT s.date, s.day, GROUP_CONCAT(bm.worker SEPARATOR ' ') as Morning
FROM schedule s LEFT JOIN
block bm ON s.id = bm.schedule_id AND bm.shift=1
GROUP BY s.date,s.day) T1
JOIN
(SELECT s.date, s.day,GROUP_CONCAT(be.worker SEPARATOR ' ') as Evening
FROM schedule s LEFT JOIN
block be ON s.id = be.schedule_id AND be.shift=2
GROUP BY s.date,s.day) T2
ON T1.Date=T2.Date AND T1.Day=T2.Day
Резултат:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris
23/09/2014 Tuesday Iqbal
Вижте резултата в SQL Fiddle .
Обяснение:
Избираме сутрин и вечер поотделно, след което свързваме тези две таблици с дата и ден. И накрая резултатът се извлича от обединената заявка.
GROUP_CONCAT
се използва за групиране на полета с една и съща дата и ден. Можем да използваме SEPARATOR ' '
за пространство като разделител. Ако премахнете SEPARATOR ' '
, ще получите резултата, разделен със запетая(,).
COALESCE
се използва за замяна на нулеви стойности с празен низ (''
).