2011-12-05 35 views
0

我有如下表:MySQL查詢發現每月活躍用戶

CREATE TABLE account (
    account_id bigint(20) NOT NULL AUTO_INCREMENT, 
    time_start datetime NOT NULL, 
    time_end datetime DEFAULT NULL, 
    PRIMARY KEY (account_id), 
    KEY idx_start (account_id,time_start), 
    KEY idx_end (account_id,time_end) 
) ENGINE=MyISAM 

我如何編寫一個查詢來發現有多少用戶登錄每月?

我想在過去的90天中查找表中每月有多少個不同的account_id。按月分組意味着每30天一次:例如2011-12-05至2011-11-06,2011-12-04至2011-11-05等,爲最後90天。

回答

2

您可以分別從YEAR()MONTH()分別取出日期時間字段中的年/月。但是你的時間段不符合月份的開始/結束時間,所以你需要一些醜陋的查詢邏輯來處理這種轉換。

您應該從編寫一個stored function/procedure開始,將常規日期/時間轉換爲「財政」日期時間,之後查詢應該變得更清晰。一旦你完成了程序,它可以在任何地方重複使用,因爲財政期間的計算無疑也會在其他地方重複進行。

1

此查詢假設兩件事: 1)您將您的月度邏輯擺平(請參閱@ Marc的帖子),並將其作爲額外列(月)添加到表格中。 2)time_start是用戶「登錄」的時間。

SELECT COUNT(*), month 
FROM account 
GROUP BY month 
HAVING time_start > ADDDATE(CURDATE(),- INTERVAL 90 DAY); 

嘗試搞砸它,看看是否有幫助。我不太確定那裏的負ADDDATE位,因此您需要檢查MySQL的參考頁面date and time functions

+0

顯然,答案是正確的。但是,特種部隊不應該成爲每個人都可以吃到飽的地方。此外,這個問題很明顯是重複的,並且已經被問過數百次了。相反,你應該報告重複。 – Gajus

+0

@Guy我沒有給他全部答案。我給了他一個「亂七八糟」的出發點,並提供了一個查詢自己的參考。只是試圖幫助。 – Aaron

1

試試這個

select count(distinct account_id) 
from account 
where 
time_start >= date_sub(now(), interval 90 day) 
group by 
floor(datediff(now(), time_start)/30)