-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 

在所有工作上

4

1 回答 1

1

下面的查询MySQL只是因为它滥用了总是选择非聚合列MySQL的第一个(而不是任意定位的)值(因此是 inner )的事实,更不用说甚至后者的可能性了。ORDER BYSELECT

参阅此 SQL 小提琴

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

于 2013-02-26T07:52:47.127 回答