当初、これは私が思いついたものです:
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
結果は
ご覧のとおり、イブニングフィールドにはファリスが2回含まれています 。そこで、2つのクエリを使用して、それらの結果を結合しました。このように:
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
説明:
朝と夕方を別々に選択し、これら2つのテーブルを日付と曜日で結合します。そして最後に、結合されたクエリから結果がフェッチされます。
GROUP_CONCAT
同じ日付と日付のフィールドをグループ化するために使用されます。 SEPARATOR ' '
を使用できます セパレータとしてのスペース用。 SEPARATOR ' '
を削除した場合 、コンマ(、)で区切られた結果が得られます。
COALESCE
null値を空の文字列に置き換えるために使用されます(''
。