一个查询中包含多个查询


Multiple queries in one query?

我在数据库中有一个表,其中列出了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> 创建一个"漂亮"的输出