考虑以下简单的 MySQL 查询:
SELECT date, count(*) cnt, ip
FROM fwlog
GROUP BY ip, date
HAVING cnt>100
ORDER BY date DESC, cnt DESC
它给了我类似的东西:
date cnt src
2013-06-20 14441 172.16.a
2013-06-20 8887 172.16.b
....
2013-06-19 14606 172.16.b
2013-06-19 12455 172.16.a
2013-06-19 5205 172.16.c
也就是说,它按日期对 IP 进行排序,然后按照指示对 IP 进行排序。
现在我希望结果是:
- 首先显示TODAY计数最高的IP,
- 然后显示过去几天该 IP 的计数(独立于 cnt),
- 然后显示 TODAY 计数第二高的 IP,
- 然后是那个IP的历史,
- 等。
期望结果的示例:
date cnt src
2013-06-20 14441 172.16.a
2013-06-19 12455 172.16.a
2013-06-18 .... 172.16.a
2013-06-17 .... 172.16.a
....
2013-06-20 8887 172.16.b
2013-06-19 14606 172.16.b
2013-06-18 .... 172.16.b
2013-06-17 .... 172.16.b
...
2013-06-20 .... 172.16.c
2013-06-19 .... 172.16.c
2013-06-18 .... 172.16.c
2013-06-17 .... 172.16.c
...
...
这甚至可以使用纯 SQL 来完成吗?
再见,
马基
===========================================
@戈登林诺夫:
SELECT
datex,
cnt,
ip
FROM
fwlog
WHERE
...
GROUP BY ip , datex
ORDER BY SUM(case
when datex = DATE(NOW()) then 1
else 0
end) DESC , src, date DESC, cnt DESC
2013-06-20 47 10.11.y
2013-06-19 47 10.11.y
2013-06-18 45 10.11.y
2013-06-17 42 10.11.y
2013-06-16 14 10.11.y
....
2013-06-20 592 172.16.a
2013-06-19 910 172.16.a
2013-06-18 594 172.16.a
2013-06-17 586 172.16.a
2013-06-20 299 172.16.b
这还不完全正确,较低的块应该在顶部。