【问题标题】:MySQL Query - Group By issuesMySQL 查询 - 按问题分组
【发布时间】:2011-07-07 09:04:52
【问题描述】:

以下 MySQL 查询为我生成了一个 session_id 列表和相关使用情况。我想做的是将每个会话分组为一行,并显示最大的上传和下载。一个用户名可以有多个重复,它必须在会话中分组。

当我尝试使用 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

【问题讨论】:

  • 您在此查询中没有使用 Group by,为什么?尝试使用它!

标签: mysql sorting group-by sql-order-by


【解决方案1】:

您应该为此使用 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

【讨论】:

    【解决方案2】:
      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()。它可能更可取,因为它可以有两个以上的参数,并且它也用于许多其他 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 个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2015-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多