2016-05-04 147 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>