2015-02-07 29 views
0

我有表user,並列login_time在計數條件的日期之間進行選擇

我想選擇一個月內登錄次數超過10次的所有用戶。

我想是這樣的:

SELECT login_time, count(id) as loginCount FROM user 

WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time 

GROUP BY id, MONTH(login_time) HAVING loginCount > 10; 

林不知道我的日期之間的選擇。 如何選擇避免雙重記錄的月份間隔。 例如,如果我有這個值login_time

1. '2015-02-01 14:05:19' 
2. '2015-01-21 14:05:19' 
3. '2015-01-11 14:05:19' 

兩個3和2的1 這樣,我得到的是價值雙重記錄一個月範圍內?

+0

是'GROUP BY id'故意:

在這裏更詳細的這一切寫上去?如果只涉及一個表,它可以防止整體分組。另外'WHERE login_time BETWEEN x AND login_time'基本上是'WHERE login_time = login_time',它總是匹配。 – Caramiriel 2015-02-07 17:37:22

+0

我不明白。您是否將用戶登錄的次數存儲在不同的表中? – karlingen 2015-02-07 17:40:24

+0

@karlingen是的,它在不同的表 – dasdasd 2015-02-07 19:47:45

回答

1

要查找在當前結束的月份中登錄超過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/

+0

謝謝。我知道我的地方很糟糕。我可以在'GROUP BY'中使用:'MONTH(login_time)'而不是'DATE(DATE_FORMAT(login_time,'%Y-%m-01'))' – dasdasd 2015-02-07 19:37:56

+1

請參閱我的編輯以回答您的問題。 – 2015-02-07 20:42:59

+0

謝謝,很好的答案。 – dasdasd 2015-02-07 21:20:04

相關問題