次の単純な 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 を日付順に並べ替え、次にカウント順に並べ替えます。
今、結果を次のようにしたいと思います。
- 最初に TODAY カウントが最も高い IP を表示し、
- 次に、過去数日間のその IP のカウントを表示します (cnt とは無関係)。
- 次に、TODAY で 2 番目に高いカウントを持つ 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
これはまだ完全ではありません。下のブロックが一番上にあるはずです。