Mysql 用于检查速率限制的SQL查询

Mysql 用于检查速率限制的SQL查询,mysql,sql,Mysql,Sql,假设我有一个用户发送的消息的表,每个消息都有一个时间戳 我想做一个查询,告诉我(历史上)一个用户在一小时内发送的消息最多 换句话说,在任何给定的1小时内,最多发送多少条消息 有什么想法吗?需要更多关于表格结构等的详细信息,但类似于: select date(timestmp), hour(timestmp) , count(*) from yourtable group by date(timestmp) , hour(timestmp) order by count(*)

假设我有一个用户发送的
消息的表,每个消息都有一个时间戳

我想做一个查询,告诉我(历史上)一个用户在一小时内发送的消息最多

换句话说,在任何给定的1小时内,最多发送多少条消息


有什么想法吗?

需要更多关于表格结构等的详细信息,但类似于:

  select date(timestmp), hour(timestmp) , count(*) 
    from yourtable group by date(timestmp) , hour(timestmp)
    order by count(*) DESC
    limit 100; 

会给你想要的结果。

像这样的方法应该可以:

SELECT MAX(PerHr) FROM 
  (SELECT COUNT(*) AS PerHr FROM messages WHERE msg_uid=? 
   GROUP BY msg_time/3600) t

假设
timestamp
为日期时间-否则,使用转换为日期时间

对于最后一小时内的[滚动]计数:

  SELECT COUNT(*) AS cnt
    FROM MESSAGES m
   WHERE m.timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 HOUR) 
                         AND NOW()
GROUP BY m.user
ORDER BY cnt DESC
   LIMIT 1
如果需要特定的小时,请指定小时:

  SELECT COUNT(*) AS cnt
    FROM MESSAGES m
   WHERE m.timestamp BETWEEN '2011-06-06 14:00:00'
                         AND '2011-06-06 15:00:00'
GROUP BY m.user
ORDER BY cnt DESC
   LIMIT 1

我怀疑这会非常缓慢,但对于任意的历史最大小时数,类似的东西可能会起作用(如果我远离,请投我一票,我不是MySQL用户):


(这里我将msg_time视为存储time_t seconds,但是如果您存储的是实际的SQL时间,那么您可以使用诸如@James show之类的SQL函数)解决方案是“在一小时内从:00发送到:59”,但是如果您指的是在任何给定的60分钟内,那么就更复杂了,你应该指定它。你只想要一个人有最多的消息,还是每个人有最多的消息…@dkamins-是的,任何60分钟的时间,谢谢@DRapp-每个用户的最高数字,谢谢!美好的正如上面有人指出的,这是否只适用于“:00到:59”类型的小时数?我希望有一种方法可以完成任何60分钟的训练,不管它何时开始/停止。不确定这在合理的时间内是否可行。太棒了——我想的是“滚动计数”。这是我见过的第一个解决方案。天哪,小马们,你们是我的英雄。
SELECT base.user, base.time, COUNT(later.time)
FROM messages base
INNER JOIN messages later ON later.time BETWEEN base.time AND DATE_ADD(base.time, INTERVAL 1 HOUR) AND base.user = later.user
WHERE base.user = --{This query will only work for one user}
GROUP BY base.user, base.time
ORDER BY COUNT(later.time) DESC
LIMIT 1