-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

以下のクエリは、後者の可能性は言うまでもなく、非集計列の最初の (任意に配置された値ではなく) 値(したがって inner ) を常に選択するMySQLという事実を悪用するためのものです。MySQLORDER BYSELECT

この 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 はサーバーが選択する値には影響しません。

2 番目の段落 (私が強調したもの) は私の声明と矛盾しているように見えますが、上記の規則に従わない結果に遭遇したことはありません (つまり、利用可能な最初の値を選択します)。さらに、ORDER BY外側の選択が行われる前に内側が発生するため、クエリは正しい値を返すことができます。

于 2013-02-26T07:52:47.127 に答える