Я пишу несколько PHP / MySQL для обнаружения чрезмерных посещений сайта. Хотя я нахожу достаточно простым для любого данного IP-адреса определить, сколько раз этот человек посещал, скажем, за 24 часа и, превышают ли они какое-либо число, являющееся максимумом посещения, с чем я борюсь, это некоторый sql, который будет Выделите общую тенденцию — сколько IP-адресов посетил каждый больше, чем пороговое количество раз за период. Пожалуйста, рассмотрите следующую упрощенную таблицу базы данных, которая, я надеюсь, объяснит более четко.
VisidID VisitIP VisitDate
----------------------------------
1 n.n.n.01 (yesterday)
2 n.n.n.02 (today)
3 n.n.n.01 (today)
4 n.n.n.03 (today)
5 n.n.n.03 (today)
6 n.n.n.03 (today)
7 n.n.n.04 (today)
8 n.n.n.05 (today)
9 n.n.n.04 (today)
10 n.n.n.06 (today)
11 n.n.n.05 (today)
12 n.n.n.07 (today)
------------------------------------
Итак, при условии, что я установил максимально допустимый порог посещения равным 2 (просто чтобы мой пример таблицы здесь небольшой) результат, который я ищу по этому табличному запросу, равен «3», поскольку было три IP-адреса (n.n.03, n.n.n.04 и n.n.n.05), чьи посещения сегодня равнялись или превышали порог посещений в 2 посещения.
Как бы мне это зафиксировать в запросе MySQL, и будет ли это быстрый и эффективный или громоздкий запрос для выполнения?
С использованием HAVING
предложение, этот запрос вернет тех, у кого число больше 2 —
SELECT `VisitIP`, COUNT(`VisitIP`) AS `CountIP`
FROM `table`
GROUP BY `VisitIP`
HAVING `CountIP` > 2
Для подсчета общего соответствия условию вы можете сделать что-то вроде этого —
SELECT COUNT(*) AS `TotalOverTwo` FROM
(SELECT `VisitIP`, COUNT(`VisitIP`) AS `CountIP`
FROM `table`
GROUP BY `VisitIP`
HAVING `CountIP` > 2
) `table`
просто напишите этот простой запрос и ваша проблема будет решена!
select count(`VisitIP`) as totalVisits from table group by(`VisitDate`) HAVING `totalVisits` > 2;