MYSQL根据从其他列分组的值对两列中的值进行汇总
我有一个网络创建的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.
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()