2011-07-07 125 views
0

以下MySQL查詢會生成一個session_ids和相關用法的列表。我想要做的是將每個會話分成一行,並顯示最大的上傳和下載內容。可以有多個用戶名重複,它必須在會話中分組。MySQL Query - Group By issues

當我嘗試使用group by時,並不總是選擇最大值。

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

你是不是在此查詢使用GROUP BY,爲什麼呢?嘗試使用它! –

回答

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個功能表中的每一行。