2011-07-07 21 views
0

次のMySQLクエリは、私にsession_idsと関連する使用法のリストを生成します。私がしたいのは、最大のアップロードとダウンロードを表示しながら、各セッションを1つの行にグループ化することです。ユーザー名は複数回繰り返すことができますが、セッション上でグループ化する必要があります。MySQLクエリ - グループ化の問題

グループ別に試してみると、最大のものが常に選択されるわけではありません。

SELECT USERNAME, ACCTSESSIONID, 
     IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0) as TOTAL_UPLOAD, 
     IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0) as TOTAL_DOWNLOAD 
    FROM ACCOUNTING 
    WHERE DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05' 
ORDER BY USERNAME ASC, ACCTSESSIONID 

-

USERNAME ACCTSESSIONID  TOTAL_UPLOAD TOTAL_DOWNLOAD 
kor1  SESSION232442  341594114  5671726599 
kor1  SESSION232442  331306202  5571382940 
kor1  SESSION232444  338083784  5609510490 
kor1  SESSION454355  323367019  5451121083 
kor2  SESSION943209  323132957  5450522047 
ran32  SESSION934082  323132957  5450522047 
ran62  SESSIONA34324  9532356  5450523537 
+0

、なぜ?それを使ってみてください! –

答えて

2

あなたはこのためにMIN()/ MAX()の集計関数を使用する必要があります。

SELECT USERNAME, ACCTSESSIONID, 
    MAX(IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0)) as TOTAL_UPLOAD, 
    MAX(IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0)) as TOTAL_DOWNLOAD 
FROM ACCOUNTING 
WHERE 
    DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05' 
GROUP BY 
    USERNAME, ACCTSESSIONID 
ORDER BY 
    USERNAME ASC, ACCTSESSIONID 

MySQLでの集計関数の詳細を:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.htmlあなたはこのクエリにして、グループを使用していない

1
SELECT USERNAME, ACCTSESSIONID, 
     MAX(IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0)) 
      AS TOTAL_UPLOAD, 
     MAX(IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0)) 
      AS TOTAL_DOWNLOAD 
    FROM ACCOUNTING 
    WHERE DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05' 
GROUP BY USERNAME ASC, ACCTSESSIONID 
ORDER BY USERNAME ASC, ACCTSESSIONID 

注1:代わりIFNULL()の、あなたもCOALESCE()を使用することができます。これは2つ以上の引数を持つことができ、多くの他のRDBMSでも使用されているので、望ましいかもしれません。

注2:代わりに:あなたが使用することができます

DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05' 

TIME_STAMP >= '2011-07-05' AND TIME_STAMP < '2011-07-06' 

テーブルのすべての行のための2つの機能を呼び出すする必要はありません。