2015-10-16 95 views
0

我有一個表users和另一個表logins每次用戶登錄到網站我們記錄在logins ex前一行。Mysql:找到每週登錄一次的活躍用戶

Users 
----- 
14 | name1 
17 | name2 
20 | name3 
21 | name4 
25 | name5 

logins 
---- 
14 | 2015-03-01 
14 | 2015-03-07 
14 | 2015-03-16 
14 | 2015-03-24 
14 | 2015-03-30 
17 | 2015-03-01 
17 | 2015-03-07 
17 | 2015-03-16 
17 | 2015-03-17 
17 | 2015-03-30 
20 | 2015-03-01 
20 | 2015-03-07 
20 | 2015-03-08 
20 | 2015-03-16 
20 | 2015-03-25 
20 | 2015-03-30 

如果開始日期爲2015-03-01和結束日期是2015-04-01然後14 & 20應選擇同時17不會被選擇,因爲他沒有在03-2203-28一週登錄,從而使結果將是

Result 
    ------ 
    2 
+0

我沒有正確理解這個問題。你如何計算一週?從星期天到星期天的午夜?你能否給出一個更詳細的例子和基於這樣的輸出樣本? – Utsav

+0

那麼如何定義你的周開始和週末呢? –

+0

@Utsav謝謝我更新了一個更好的例子問題 – trrrrrrm

回答

1

首先你每週的用戶已經在至少一次登錄的名單,那麼你每月計算用戶的數量:

SELECT LoginYear,LoginWeek,COUNT(*) as NumbUsers 
FROM (
    SELECT Year(logins.date) as LoginYear, Week(logins.date) as LoginWeek, logins.UserID 
    FROM logins 
    WHERE logins.date>='2015-03-01' 
    GROUP BY LoginYear, LoginWeek, logins.UserID 
    HAVING COUNT(*)>0 
) t 
GROUP BY LoginYear,LoginWeek; 


周編號: MySQL能夠算以不同的方式(例如從星期天/星期一開始)使用模式:WEEK(date,mode)。請參閱WEEK MySQL documentation


更新:獲得已記錄每星期至少一次的人數:首先我們得在子查詢weektable被記錄在每星期至少一次的用戶。然後,用戶選擇具有等於該週期中的總週數(因此每週在線)的周計數。最後我們數一下這些用戶。

SELECT COUNT(*) 
FROM (
    SELECT UserID 
    FROM (
    SELECT Year(logins.date) as LoginYear, Week(logins.date) as LoginWeek, logins.UserID 
    FROM logins 
    WHERE logins.date>='2015-03-01' 
    GROUP BY LoginYear, LoginWeek, logins.UserID 
    HAVING COUNT(*)>0 
    ) weektable 
    GROUP BY UserID 
    HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW()) 
) subq; 

注1:我把日期「2015年3月1日」作爲一個例子,但你可以改變這或將作爲一個變量。

注2:取決於您選擇它可以通過TIMESTAMPDIFF周計數小於周的最大數量(由COUNT(*)計),因爲它不指望半周的日期。所以我把>=放在最後一行:HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW())

+0

謝謝你的回答。這將顯示在該範圍內的任何給定周內登錄的用戶總數。我需要的是自開始日期以來每週登錄的用戶總數 – trrrrrrm

+0

真棒,它按預期工作!謝謝 – trrrrrrm

-1

我不能在此刻卻喜歡

SELECT COUNT(Users.id) WHERE logins.date>=XXXX AND logins.date<=XXXX GROUP BY Users.id 

的東西在這裏進行測試應該工作

+0

這不會排除用戶登錄第1周9月但不是星期2 9月 – trrrrrrm

+0

不好給我一個答案的反對票,這是正確的,你的不明確的定義的排隊。 –