MySQL « Выборка данных за определенный период
Есть БД(MySQL) в которую заносятся данные и время добавления этих данных и предо мной встала задача - вытащить из БД все записи с определенным ip адресом(это поле такое в БД), добавленные за последние 10 минут и посчитать их. т.е. если с этого ip адреса добавлено больше N записей за 10 минут, то ему ограничивается доступ. Как составить такой запрос?
Заранее благодарен за помощь в решении вопроса.
Заранее благодарен за помощь в решении вопроса.
1 ответов
Чтобы выбрать записи за последние 10 минут:
select *
FROM `YOUR_TABLE`
where `TIME_KEY` => (now() - interval 10 minute);
Я бы не рекомендовал обращаться к таблице логов посещенгий таким образом.
Запросы, что указали уважаемые коллеги, требуют наличия индексов по-по полям IP и TIME, либо небольшое количество записей, попоадающих в обработку. Индексы многократно замедлят скорость записи в таблицу. И с этим мы ничего поделать не сможем. А вот уменьшить число записей, попадающих в обработку можем запросто.
Через предзапрос.
SELECT COUNT(a.id) AS `count`
FROM (SELECT * FROM 'table' order by id desc limit <значение гарантированно покрывающее число записей на необходимый интервал>) as a
WHERE a.`time` > (NOW() - INTERVAL 10 MINUTE) AND a.`ip` = '192.168.1.1'
В реальных проектах выборки по таблицам логов приблизительно таким образом и делаются.
SELECT COUNT(*) AS `repeat`, *
FROM `database`
WHERE MINUTE(`time`) BETWEEN 0 AND 10 AND `ip` = '192.168.2.208'