Ban đầu, đây là những gì tôi nghĩ ra:
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
Kết quả:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris Faris
23/09/2014 Tuesday Iqbal
Kết quả là Fiddle .
Như bạn có thể thấy trường Buổi tối chứa Faris hai lần . Vì vậy, tôi đã sử dụng hai truy vấn và kết hợp các kết quả đó. Như thế này:
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
Kết quả:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris
23/09/2014 Tuesday Iqbal
Xem kết quả trong SQL Fiddle .
Giải thích:
Chúng tôi đang chọn cho Buổi sáng và Buổi tối riêng biệt, sau đó chúng tôi sẽ ghép hai bảng này với ngày và ngày. Và cuối cùng kết quả được tìm nạp từ truy vấn đã kết hợp.
GROUP_CONCAT
được sử dụng để nhóm các trường có cùng ngày và ngày. Chúng tôi có thể sử dụng SEPARATOR ' '
cho không gian làm dấu phân cách. Nếu bạn xóa SEPARATOR ' '
, bạn sẽ nhận được kết quả được phân tách bằng dấu phẩy (,).
COALESCE
được sử dụng để thay thế các giá trị rỗng bằng chuỗi trống (''
).