2012-02-16 106 views
5

我幾乎惹毛了,而試圖解決此問題:SQL查詢來算註冊用戶每

在我的應用程序的用戶可以註冊並刪除themselfes。創建日期和刪除日期作爲時間戳記在數據庫中保存。我需要知道在一天中的每一天,當天有多少註冊用戶和未被刪除的用戶。

因此,如果我在2012-02-01上有10個現有用戶,2012-02-03上刪除了該帳戶的一個用戶,2012-02-04上註冊了三個用戶,2012-02- 06,和查詢註冊用戶總數從2012-02-01到2012-02-07我想獲得這樣的結果:

 
day    total_users 
2012-02-01  10 
2012-02-02  10 
2012-02-03  9 
2012-02-04  12 
2012-02-05  12 
2012-02-06  10 
2012-02-07  10 

這是我簡單的用戶表的樣子:

USER_ID,USER_NAME,created_at,deleted_at

這是沒有問題的,以獲得數Ò ˚F登記,不會被刪除用戶的某一天(這裏2012-02-01,這將讓我一個10在我的例子):

select application.application_id as application_id, count(user.user_id) as user_total 
from application, user 
where application.application_id = user.application_id 
and date(user.created_at) <= '2012-02-01' 
and ((date(user.deleted_at) > '2012-02-01') or (user.deleted_at is null)) 

誰有線索我怎麼可以創建一個查詢(沒有光標)會有我的預期結果?我的數據庫是Debian上的MySQL 5.0.51。

在此先感謝 馬庫斯

回答

2

如果你有一個日期在其列表(稱爲像日曆)的表,你可以使用這樣的查詢:

select c.calendar_date, count(*) user_total 
from calendar c 
left join user u 
     on date(u.created_at) <= c.calendar_date and 
      (date(u.deleted_at) > c.calendar_date or u.deleted_at is null) 
group by c.calendar_date 

如果您沒有包含日期​​列表的表格,則可以使用以下查詢模擬一個表格:

select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
where calendar_date between ? /*start of date range*/ and ? /*end of date range*/ 
+0

非常感謝,完美的作品!我只需要用t0,t1等替換每行中的「i」,我認爲這是我的舊MySQL服務器的錯。 – 2012-02-17 08:38:51

+0

@MarcusMuench:哎呀,我的錯。我已更正查詢 - 謝謝。 – 2012-02-17 10:25:02

2
SELECT date(user.created_at) as "creation_date", count(user.user_id) as "user_total" 
FROM application a 
INNER JOIN user u ON a.application_id = u.application_id 
WHERE date(user.created_at) <= '2012-02-01' 
AND ((date(user.deleted_at) > '2012-02-01') or (user.deleted_at is null)) 
GROUP BY date(user.created_at) 
ORDER BY date(user.created_at) ASC 
+0

+1。 @ user1214154,請注意,這將不會列出那天沒有任何註冊用戶的日期,並將0作爲計數。它只會輸出表格中存在的天數 – talereader 2012-02-16 16:11:18

+0

這不會返回每天註冊用戶的數量 - 相反,它會返回每天在*上註冊*的用戶數量。考慮到問題中描述的示例數據,它將不會生成所需的輸出 - 相反,它會在2012年2月1日之前生成多個用戶和日期(總計最多添加10個用戶),而2012年之後不會生成任何用戶和日期 - 02-01。 – 2012-02-16 17:01:44