2011-07-07 4 views
0

La requête MySQL suivante me produit une liste de session_ids et l'utilisation associée. Ce que je voudrais faire est de grouper chaque session dans une rangée avec le plus grand affichage de chargement et de téléchargement. Il peut y avoir plusieurs répétitions d'un nom d'utilisateur, il doit être groupé sur la session.MySQL Query - Group Par problèmes

Lorsque j'utilise group by, le plus grand n'est pas toujours sélectionné.

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

Vous n'êtes pas en utilisant le groupe par dans cette requête, pourquoi? Essayez de l'utiliser! –

Répondre

2

Vous devez utiliser MIN()/MAX() des fonctions d'agrégation pour cela:

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 

En savoir plus sur la fonction globale dans 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 

Note 1: Au lieu de IFNULL(), vous pouvez également utiliser COALESCE(). Il peut être préférable car il peut avoir plus de 2 arguments et il est également utilisé dans de nombreux autres SGBDR.

Note 2: Au lieu de:

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

vous pouvez utiliser:

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

Pas besoin d'appeler 2 fonctions pour chaque ligne de la table.