Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL根据从其他列分组的值对两列中的值进行汇总_Mysql_Sql_Group By_Sql Order By - Fatal编程技术网

MYSQL根据从其他列分组的值对两列中的值进行汇总

MYSQL根据从其他列分组的值对两列中的值进行汇总,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,我有一个网络创建的MYSQL表,其中包含以下字段: IP_SRC, IP_DST, BYTES_IN, BYTES_OUT, START_TIME, STOP_TIME 1.1.1.1 8.8.8.8 1080 540 1580684018 1580684100 8.8.4.4 1.1.1.1 2000 4000 1580597618 1580597800 IP_ADDR, TotalOutBytes 1.1.1.1 12345 8.

我有一个网络创建的MYSQL表,其中包含以下字段:

IP_SRC, IP_DST, BYTES_IN, BYTES_OUT, START_TIME, STOP_TIME
1.1.1.1 8.8.8.8 1080      540        1580684018  1580684100
8.8.4.4 1.1.1.1 2000      4000       1580597618  1580597800
IP_ADDR, TotalOutBytes
1.1.1.1      12345
8.8.8.8      83747
8.8.4.4      2389
时间值是历元时间刻度,每个记录基本上是一个TCP会话。IP地址存储为“int(10)unsigned”,即使用INET_NTOA获取“1.1.1.1”字符串。开始时间、停止时间、输入字节和输出字节也是“int(10)无符号”

我想制定一个查询(或过程)以返回包含以下字段的表:

IP_SRC, IP_DST, BYTES_IN, BYTES_OUT, START_TIME, STOP_TIME
1.1.1.1 8.8.8.8 1080      540        1580684018  1580684100
8.8.4.4 1.1.1.1 2000      4000       1580597618  1580597800
IP_ADDR, TotalOutBytes
1.1.1.1      12345
8.8.8.8      83747
8.8.4.4      2389
其中,对于给定的IP地址(如1.1.1.1),TotalOutBytes是IP DST为1.1.1.1时的IN_字节和IP SRC为1.1.1.1时的OUT_字节之和。我希望原始表中的所有IP_SRC和IP_DST都在新表中进行说明。我还想收集过去24小时的数据

以下是我所拥有的用于汇总IN_字节的功能(如果总量超过50MB,则以兆字节的降序报告):


IP\u ADDR
是目的地,当
IP\u ADDR
是源时,您可以使用
UNION
创建一个包含
BYTES\u IN
的派生表,然后对该表上的字节进行
SUM

SELECT IP_ADDR, SUM(BYTES) AS TotalOutBytes
FROM (
  SELECT IP_SRC AS IP_ADDR, BYTES_OUT AS BYTES
  FROM flowsv4
  UNION ALL
  SELECT IP_DST, BYTES_IN
  FROM flowsv4
) f
GROUP BY IP_ADDR

通过删除不必要的嵌套,可以大大简化现有查询

要根据包含相关
ip
的列对不同字段求和,可以使用
大小写表达式:

select 
    inet_ntoa(ip_dst_addr) as ip_addr, 
    format(
        sum(case '1.1.1.1'
            when ip_dst then in_bytes 
            when ip_src then out_bytes
        end) / 1048576,
        0
    ) totalBytes
from flowsv4 
where first_switched 
    between unix_timestamp(now() - interval 1 day) and unix_timestamp(now())
group by ip_dst_addr
having totalBytes > 50
order by totalBytes desc
请注意,由于排序使用的是格式化的Mb值,因此排序的精度比原始查询中的略低。如果这对您来说真的很重要,那么您可以重复
orderby
子句中的条件
sum()