主要是帮同学解决的一个问题,用到 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