我在数据库中有一个表,其中列出了Mysql中一些员工一周中每天的开始和停止时间,方法如下:
代理日开始结束agent1周一17:00 23:00代理人1周二16:00 23:00代理人1周三18:00 23:00
我需要这个以以下方式显示:
代理人周一周二周三开始-停止开始-停止代理人1 17:00 23:00 16:00 23:00 18:00 23:00
有没有办法通过查询来做到这一点?我想在一个查询中进行多个查询,但我不太明白。
你可以起诉很多案件
select agent,
case day when 'Mon' then start end as start_mon,
case day when 'Mon' then `end` end as end_mon,
case day when 'Tue' then start end as start_tue,
case day when 'Tue' then `end` end as end_the,
case day when 'Wed' then start end as start_wed,
case day when 'Wed' then `end` end as end_wed
from your_table
要获取代理的同一行上的值,可以使用临时表并对bt 进行分组
select agent, max(start_mon), max(end_mon), max(start_tue), max(end_tue), max(start_wed), max(end_web)
from (
select agent,
case day when 'Mon' then start end as start_mon,
case day when 'Mon' then `end` end as end_mon,
case day when 'Tue' then start end as start_tue,
case day when 'Tue' then `end` end as end_the,
case day when 'Wed' then start end as start_wed,
case day when 'Wed' then `end` end as end_wed
from your_table ) as t
group by agent;
您只需要一个查询,就可以按正确的顺序获得所有信息。因此,先由代理商订购,然后按天订购。
由于您不能按字母顺序排列天数,因此需要例如CASE
语句来获得正确的顺序:
SELECT
*
FROM `your_table`
ORDER BY
`agent`,
CASE
WHEN `Day` = 'Mon' THEN 1
WHEN `Day` = 'Tue' THEN 2
...
WHEN `Day` = 'Sun' THEN 7
END
当然,存储日期而不是文本会提高效率。
然后,当您获得所有行时,您会跟踪当前代理,一旦代理发生更改,您就会添加一个新行。
考虑使用group_concat
函数的解决方案,该函数将为具有所有所需时间范围的特定代理获取所有天数:
SELECT Agent, group_concat(Day,' ', Start, '-', End separator '/') AS dayData
FROM `schedules`
GROUP BY Agent
这将得到如下所示的结果集:
Agent | dayData
-----------------------------
agent1 | Mon 17:00-23:00/Tue 16:00-23:00/Wed 18:00-23:00
agent2 | .... ..
当在PHP端获取结果集时,您可以使用explode('/', $row['dayData'])
轻松地处理每一行(获取具有时间范围的天数数组)。然后,用explode(" ", $day)
分解每个项目。。。然后,您可以使用html <table>
创建一个"漂亮"的输出