我目前在做一个基于web的排类系统项目。我想从数据库中获取数据,并将其显示在表格中(计划格式)。
在数据库中,我有 2 个表
schedule id date day 1 22/09/2014 Monday 2 23/09/2014 Tuesday
block block_id schedule_id worker shift 1 1 Ahmad 1 2 1 Abdul 1 3 1 Faris 2 4 2 Iqbal 2
schedule 的每一天都有几个 block,schedule_id(在 block 中)是指它应该是哪一天。 Column shift (in block) 将 block 定义为早上 (shift=1) 和晚上 (shift=2),
我想显示这样的东西
date day Morning Evening 22/09/2014 Monday Ahmad Faris Abdul 23/09/2014 Tuesday Iqbal
我试过创建像这样的sql语句
SELECT schedule.date, schedule.day, block.worker FROM schedule LEFT JOIN block ON schedule.id = block.schedule_id
但是表格的格式不合适
date day Morning Evening 22/09/2014 Monday Ahmad 22/09/2014 Monday Abdul 22/09/2014 Monday Faris 23/09/2014 Tuesday Iqbal
我知道我的陈述中遗漏了一些东西,以及我如何做到这一点。
感谢您的帮助。
最佳答案
最初,这是我想出的:
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 .
如您所见,Evening 字段两次包含 Faris。所以我使用了两个查询并加入了这些结果。像这样:
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 中查看结果.
解释:
我们分别选择 Morning 和 Evening,然后我们将这两个表与日期和日期连接起来。最后从连接的查询中获取结果。
GROUP_CONCAT
用于对具有相同日期和日期的字段进行分组。我们可以使用 SEPARATOR ' '
作为空格分隔符。如果您删除 SEPARATOR ' '
,您将得到由逗号 (,) 分隔的结果。
COALESCE
用于将空值替换为空字符串(''
)。
关于php - 某列分组显示的SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24007439/