Au départ, voici ce que j'ai trouvé :
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
Résultat :
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris Faris
23/09/2014 Tuesday Iqbal
Résultat en violon .
Comme vous pouvez le voir, le champ Soirée contient Faris deux fois . J'ai donc utilisé deux requêtes et joint ces résultats. Comme ceci :
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
Résultat :
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris
23/09/2014 Tuesday Iqbal
Voir le résultat dans SQL Fiddle .
Explication :
Nous sélectionnons pour Matin et Soir séparément, puis nous joignons ces deux tableaux avec la date et le jour. Et enfin, le résultat est extrait de la requête jointe.
GROUP_CONCAT
est utilisé pour regrouper les champs ayant la même date et le même jour. Nous pouvons utiliser SEPARATOR ' '
pour l'espace comme séparateur. Si vous supprimez SEPARATOR ' '
, vous obtiendrez le résultat séparé par une virgule (,).
COALESCE
est utilisé pour remplacer les valeurs nulles par une chaîne vide (''
).