2

简介

我正在使用FreeRadius并且我想查询我的表,radacct并在给定的年份中选择两个字段(字段)并datetime提供一个SUM和每个月。bytes_sendbytes_received

我的数据库布局

fieldtype    fieldname
---------    ----------
varchar      username
datetime     start
datetime     end
bigint       bytes_send
bigint       bytes_received

数据库数据

username    start                  end                      bytes_send    bytes_received
---------   -------------------    -------------------      ----------    --------------
admin       2013-04-22 22:14:34    2013-04-22 22:24:51      8723142       851314
admin       2013-05-14 11:50:50    2013-05-15 11:58:35      11073753      958437
admin       2013-05-14 14:36:24    2013-05-15 15:11:59      869125711     3152551
admin       2013-05-15 20:45:16    2013-05-15 20:47:11      2373753       114857
demo        2013-05-14 23:21:51    2013-05-15 05:32:20      59125919      3815816

期望的输出

我想要一个查询,它会输出类似这样的内容(SQL 查询只需要知道年份(2013在这种情况下)和用户名(admin在这种情况下)。

username   month  total_bytes
--------   -----  -----------
admin      04     9574456
admin      05     886799062

我的解决方案

我可能会用 PHP 来做这件事,我设置了一年(2013在这种情况下)并使用一个简单的 for 循环执行 12 个查询(每个月一个)。

我的问题

我提出的解决方案可能不是最好的解决方案,因此我想知道这是否可以只用一个查询来完成?

4

2 回答 2

2

一个简单的聚合就可以了

SELECT
    username, MONTH(start), SUM(bytes_send+bytes_received)
FROM
    MyTable
WHERE
     -- avoiding the YEAR function on a predicate
    start >= '20130101' AND start < '20140101'
    AND
    username = 'admin'
GROUP BY
    username, MONTH(start)
于 2013-05-15T13:03:53.933 回答
0
SELECT 
   username, TIMEDIFF(start,end), SUM(bytes_send + bytes_received)
FROM
   table
WHERE
   start>='20130101' AND start<'20140101'

这将给出用户名、两个日期之间的时间差和字节总和。这是请求数据的最简单的查询。如果需要,添加 WHERE 以进一步限制您获得的数据。

于 2013-05-15T13:17:23.083 回答