要查找在當前結束的月份中登錄超過10次的用戶,請執行此操作。
SELECT COUNT(*) times_logged_in,
userid
FROM user
WHERE login_time >= NOW() - INTERVAL 1 MONTH
GROUP BY user_id
HAVING COUNT(*)> 10
要找到在表中的任何日曆月份中登錄超過10次的用戶,請執行此操作。
SELECT COUNT(*) times_logged_in,
DATE(DATE_FORMAT(login_time, '%Y-%m-01')) month_beginning,
userid
FROM user
GROUP BY user_id, DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
HAVING COUNT(*)> 10
這裏的技巧是表達DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
,這將任何時間戳在它出現的月的第一天。
你的問題中提到此WHERE
條件:
WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time
這並不做任何事情有趣,因爲它總是回來真。每個給定login_time
總是落在您指定的時間間隔內。
編輯:如果您願意,您可以GROUP BY MONTH(dt)
。但我已經顯示它的方式會自動記錄幾年和幾個月,所以在我看來,準確報告會更好。
另一編輯:此公式爲任何給定日期或時間戳項目生成上一個星期日。
FROM_DAYS(TO_DAYS(login_time) -MOD(TO_DAYS(login_time) -1, 7))
如果星期一是一週中你管轄的第一天,改變-1
到-2
。使用此功能進行分組優於GROUP BY WEEK(login_time)
,因爲WEEK()
在日曆年的開始和結束處做了奇怪的事情。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
是'GROUP BY id'故意:
在這裏更詳細的這一切寫上去?如果只涉及一個表,它可以防止整體分組。另外'WHERE login_time BETWEEN x AND login_time'基本上是'WHERE login_time = login_time',它總是匹配。 – Caramiriel 2015-02-07 17:37:22
我不明白。您是否將用戶登錄的次數存儲在不同的表中? – karlingen 2015-02-07 17:40:24
@karlingen是的,它在不同的表 – dasdasd 2015-02-07 19:47:45