2016-05-04 142 views
0

我在开始时的数据库中的表和停止时间为一周的每一天对一些工作人员在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

您只需要1个查询就可以了。到目前为止,你有什么? – jeroen

+0

我每天都想做这样的事情: 选择(从日程安排中选择start_dt,其中day ='Mon')为'MonStart', (从日程安排中选择end_dt ='Mon')为'EndStart'; –

+0

如果会有更多的代理商,“agent2”,“agent3”,该怎么办? – RomanPerekhrest

回答

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  

对于刚开在同一行代理的价值,你可以使用一个临时表和组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;  
+0

这几乎是因为它有数据分开的日子,但将首先开始与星期一然后去与星期二等...是否有可能得到这一切在相同的每个代理行? –

+0

这是完美的,正是我所需要的。谢谢 –

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 

存放天数,而不是文本将使这多一点的效率当然。

然后,当您获取所有行时,您会跟踪当前代理,并且一旦代理发生更改,就会添加一个新行。

+0

注意到,我会去经纪人并做一些改变,以便将日子当作数字值。 –

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) ...分解每个项目...等等。之后,您可以使用html创建一个“美丽”输出<table>