2013-02-26 59 views
-2

我是PhP初學者請幫我完成以下要求。查詢員工的空閒時間

我有有

EMPLOYEECODE JOBCODE STARTTIME(in float) ENDTIME(in float) 
1001   01  09.5101    12.1545 
1001   01  13.255     14.525 
1001   02  15.000     16.525 
1002   01  09.000     12.1058 
1002   02  13.00     17.1254 

我想每個崗位和員工的總空閒時間,每個僱工的空閒時間,將顯示類似下面的表

EMPLOYEECODE JOBCODE IdleTime(HH:MM) TotalIdleTime(HH:MM) 
1001   01   ?      ? 
1001   01   ?      ? 
1001   02   ?      ? 
1002   01   ?      ? 
1002   02   ?      ? 

得到一個數據庫表在上表中的數據將顯示類似於

EMPLOYEECODE JOBCODE     IdleTime(HH:MM)   TotalIdleTime(HH:MM) 
1001   (last worked)02   idle time on last job  total idle time of 1001 

所有職位

+1

[你有什麼嘗試?](http://whathaveyoutried.com/) – 2013-02-26 07:21:23

+0

'IdleTime === ENDTIME - STARTTIME',對不對? – aefxx 2013-02-26 07:23:41

+0

在你的情況下,寫入OP的「員工空閒時間」約爲20秒! – 2013-02-26 07:29:18

回答

1

的下面查詢是MySQL僅因爲它濫用事實MySQL總是挑選的第一個(而不是任意地定位)非聚合列(因此內ORDER BY)的值,更不用說的可能性甚至SELECT的後者。

see this SQL Fiddle

SELECT x.EMPLOYEECODE 
     , MAX(x.JOBCODE) AS JOBCODE 
     , x.IdleTime 
     , SUM(x.IdleTime) AS TotalIdleTime 
    FROM (SELECT EMPLOYEECODE 
       , JOBCODE 
       , SUM(ENDTIME - STARTTIME) AS IdleTime 
      FROM employee 
     GROUP BY EMPLOYEECODE, JOBCODE 
     ORDER BY EMPLOYEECODE ASC, JOBCODE DESC) AS x 
GROUP BY x.EMPLOYEECODE 
ORDER BY x.EMPLOYEECODE ASC 

而這正是該文件必須說:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考 未命名的非聚合列在GROUP BY子句中。這意味着 前面的查詢在MySQL中是合法的。您可以使用此功能 以避免不必要的列排序和 分組以獲得更好的性能。但是,這對於每個 組中未在GROUP BY中指定的每個 非聚合列中的所有值都相同時都很有用。

服務器可以自由選擇每組中的任何值,因此除非它們相同,否則所選的值是不確定的。 此外,每個組的值的選擇不能受到添加ORDER BY子句影響的 的影響。結果集 的排序發生在選擇值之後,並且ORDER BY不會影響服務器選擇的值的 。

(由我強調)第二段似乎違揹我的發言,但我從來沒有遇到過,將不遵循上述規則的結果(即選擇可用的第一個值)。除了內部的ORDER BY在外部選擇發生之前確實發生,並因此允許查詢返回正確的值。