2011-06-07 53 views
4

假設我有一個用戶發送的messages表,每個表都有一個時間戳。SQL查詢檢查速率限制

我想做一個查詢,它會告訴我(歷史上)用戶在一個小時內發送的最多的消息數。

換句話說,在任何給定的1小時內,發送的消息數量最多。

任何想法?

+0

解決方案即將發佈爲「從一小時內發送:00至:59」,但如果您的意思是在任何給定的60分鐘內,那麼它就更加複雜,您應該指定。 – dkamins 2011-06-07 02:45:51

+0

你想只有一個人的消息數量最多,或消息的最高數量每個人... – DRapp 2011-06-07 02:53:43

+0

@dkamins - 是任何60分鐘的時間,謝謝! @DRapp - 每個用戶的最高號碼,謝謝! – 2011-06-08 18:04:50

回答

2

假設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 
+0

太棒了 - 「滾動計數」是我的想法。這是我見過的第一個解決方案。 OMG小馬,你是我的英雄。 – 2011-06-08 18:10:00

2

需要對錶結構等詳細信息,但這樣的:

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

會給你HTE期望的結果。

+0

不錯!正如有人指出的那樣,這是否只適用於「:00至:59」類型小時?希望有一種方法可以做任何60分鐘的時間,而不管它何時開始/停止。不知道在任何合理的時間內這是否可行。 – 2011-06-08 18:06:55

1

像這樣的東西應該工作:

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

(在這裏,我將msg_time視爲存儲time_t秒,但如果您正在存儲實際的SQL TIME,那麼您可以使用SQL函數,例如@James顯示) – dkamins 2011-06-07 02:44:43

1

我懷疑這將是可怕的慢,但對於任意的歷史最高小時,這樣的事情可能工作(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