主要是帮同学解决的一个问题,用到 SQL 中的 GROUP BY。
问题:一个表(AttackIP)有两个字段,端口号(Port)和访问时间(Atime),求出同一分钟内每个 IP 出现的次数。
解决思路
考虑到逻辑的清晰,先创建一个视图 AttackLog。视图将每条记录中的时间字段转换为时间戳,并且修改为该时间所属分钟的初始时刻(Atime)。如此,问题转换为查找相同 Atime 分组内具有相同 Port 字段的记录数量。
SQL 语句如下:
1 2 3 |
mysql>CREATE VIEW AttackLog AS SELECT Port, UNIX_TIMESTAMP(Atime) DIV 60 * 60 AS Atime FROM AttackIP; mysql>SELECT Port, count(Port) AS Times, FROM_UNIXTIME(Atime) AS Atime FROM AttackLog GROUP BY Atime, Port; |
测试数据
AttackIP 表
Port | Atime |
---|---|
22 | 2013-03-03 03:05:06 |
22 | 2013-03-03 03:05:50 |
22 | 2013-03-03 03:05:45 |
42 | 2013-03-03 03:05:45 |
42 | 2013-03-03 03:04:45 |
22 | 2013-03-03 03:06:45 |
42 | 2013-03-03 03:04:02 |
查询结果
Port | Times | Atime |
---|---|---|
42 | 2 | 2013-03-03 03:04:00 |
22 | 3 | 2013-03-03 03:05:00 |
42 | 1 | 2013-03-03 03:05:00 |
22 | 1 | 2013-03-03 03:06:00 |
视图可以由子查询代替,不再赘述。
注:转载注明出处并联系作者,本文链接:https://nodefe.com/mysql-group-by-two-or-more/