2013-02-26 82 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在外部选择发生之前确实发生,并因此允许查询返回正确的值。