假設我有一個用戶發送的messages
表,每個表都有一個時間戳。SQL查詢檢查速率限制
我想做一個查詢,它會告訴我(歷史上)用戶在一個小時內發送的最多的消息數。
換句話說,在任何給定的1小時內,發送的消息數量最多。
任何想法?
假設我有一個用戶發送的messages
表,每個表都有一個時間戳。SQL查詢檢查速率限制
我想做一個查詢,它會告訴我(歷史上)用戶在一個小時內發送的最多的消息數。
換句話說,在任何給定的1小時內,發送的消息數量最多。
任何想法?
假設timestamp
是一個DATETIME - 否則,使用FROM_UNIXTIME轉換爲DATETIME ...
對於[滾動]最後一個小時內算:
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
太棒了 - 「滾動計數」是我的想法。這是我見過的第一個解決方案。 OMG小馬,你是我的英雄。 – 2011-06-08 18:10:00
需要對錶結構等詳細信息,但這樣的:
select date(timestmp), hour(timestmp) , count(*)
from yourtable group by date(timestmp) , hour(timestmp)
order by count(*) DESC
limit 100;
會給你HTE期望的結果。
不錯!正如有人指出的那樣,這是否只適用於「:00至:59」類型小時?希望有一種方法可以做任何60分鐘的時間,而不管它何時開始/停止。不知道在任何合理的時間內這是否可行。 – 2011-06-08 18:06:55
像這樣的東西應該工作:
SELECT MAX(PerHr) FROM
(SELECT COUNT(*) AS PerHr FROM messages WHERE msg_uid=?
GROUP BY msg_time/3600) t
(在這裏,我將msg_time視爲存儲time_t秒,但如果您正在存儲實際的SQL TIME,那麼您可以使用SQL函數,例如@James顯示) – dkamins 2011-06-07 02:44:43
我懷疑這將是可怕的慢,但對於任意的歷史最高小時,這樣的事情可能工作(downvote我,如果我的路要走,我不是一個MySQL人):
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
解決方案即將發佈爲「從一小時內發送:00至:59」,但如果您的意思是在任何給定的60分鐘內,那麼它就更加複雜,您應該指定。 – dkamins 2011-06-07 02:45:51
你想只有一個人的消息數量最多,或消息的最高數量每個人... – DRapp 2011-06-07 02:53:43
@dkamins - 是任何60分鐘的時間,謝謝! @DRapp - 每個用戶的最高號碼,謝謝! – 2011-06-08 18:04:50