我在数据库中有一个表,其中包含Mysql中某些员工的一周中每天的开始和停止时间,方法如下:
Agent Day Start End agent1 Mon 17:00 23:00 agent1 Tue 16:00 23:00 agent1 Wed 18:00 23:00
我需要以下列方式显示:
Agent Mon Tue Wed start stop start stop start stop agent1 17:00 23:00 16:00 23:00 18:00 23:00
有没有办法通过查询执行此操作?我想在一个查询中做多个查询,但我不太明白。
答案 0 :(得分:0)
你可以起诉很多案件
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
对于gettin在同一行代理上的值,您可以使用临时表和组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;
答案 1 :(得分:0)
您只需要一个查询,您可以按正确的顺序获取所有信息。所以首先按代理商订购然后按天订购。
由于您无法按字母顺序排列日期,因此您需要一个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
存储日期编号而不是文本会使这更有效率。
然后,当您获得所有行时,您将跟踪当前代理,并在代理更改后立即添加新行。
答案 2 :(得分:0)
考虑使用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)
爆炸每个项目...等等。在那之后,你可以创造一个美丽的&#34;输出使用html <table>