php - 某列分组显示的SQL语句

标签 php mysql sql database phpmyadmin

我目前在做一个基于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/

相关文章:

php - 使用 SQL Select 语句更新临时表的问题

php - 将 mysql TIME 从 24 HR 转换为 AM/PM 格式

php - 短信网关无法发送短信

php - MySQL/PHP - 转义字符可能会降低我的数据库速度(或使其意外执行)

mysql - Sequelize 可以处理与一个表关联的多个键吗?

php - 如果其他表中不存在,则从 mysql 中检索值

php - MySQL 查询不接受来自 PHP 的 char(32) 字段的字符串

php - 采埃孚 : How to get current url on any page in the view?

mysql - 为什么不同数据库上的两个mysql锁定和刷新语句挂起

MYSQL 使用 Union 组合两个查询