2010-08-18 63 views
1

我有一個名爲user_logins的表,它跟蹤用戶登錄到系統中。它有三列,LOGIN_ID,USER_ID和login_timeMySQL查詢幫助分組和添加

login_id(INT) | user_id(INT) | login_time(TIMESTAMP) 
------------------------------------------------------ 
     1  |  4  | 2010-8-14 08:54:36 
     1  |  9  | 2010-8-16 08:56:36 
     1  |  9  | 2010-8-16 08:59:19 
     1  |  3  | 2010-8-16 09:00:24 
     1  |  1  | 2010-8-16 09:01:24 

我期待編寫一個查詢,將決定每一天唯一登錄的次數,如果那天有一個登錄,只從過去的30天當前日期。因此,對於輸出應該是這樣的

logins(INT) | login_date(DATE) 
--------------------------- 
    1  | 2010-8-14 
    3  | 2010-8-16 

在結果表,因爲USER_ID 9在每天兩次記錄,並他登錄到系統2010-8-16只有3只算作1所登錄的那一天。我只爲特定的一天尋找唯一的登錄信息。請記住,我只想過去30天,因此它就像系統最近一個月用戶登錄的快照。

我試圖創建收效甚微我有什麼到目前爲止,這是查詢,

SELECT 
    DATE(login_time) as login_date, 
    COUNT(login_time) as logins 
FROM 
    user_logins 
WHERE 
    login_time > (SELECT DATE(SUBDATE(NOW())-1)) FROM DUAL) 
    AND 
    login_time < LAST_DAY(NOW()) 
GROUP BY FLOOR(login_time/86400) 

我知道這是錯誤的,這將返回所有登錄僅從當前月初開始並沒有按對他們正確分組。有關如何做到這一點的方向將不勝感激。謝謝

+0

你的WHERE子句似乎是從你的問題問什麼不同的哪一個是正確的 - 在WHERE子句。查詢或問題? – 2010-08-18 11:01:35

+0

的問題,我知道查詢是錯誤 – IamBanksy 2010-08-18 11:03:28

+0

我需要更改查詢來做我在描述的問題 – IamBanksy 2010-08-18 11:03:47

回答

0

您需要使用COUNT(DISTINCT ...)

SELECT 
    DATE(login_time) AS login_date, 
    COUNT(DISTINCT login_id) AS logins 
FROM user_logins 
WHERE login_time > NOW() - interval 30 day 
GROUP BY DATE(login_time) 

我有點不確定你想要什麼,你的WHERE子句,因爲你的問題似乎自相矛盾。您可能需要根據所需修改WHERE子句。

+0

謝謝這有助於我只需要得到日期事情整理出來 – IamBanksy 2010-08-18 11:04:16

+0

@IanBanksy :如果你還沒有這樣做,請按刷新,看看是否e更新了答案。 – 2010-08-18 11:05:42

+0

非常感謝你,工作完美。 – IamBanksy 2010-08-18 11:21:48

0

正如馬克建議你可以使用COUNT(DISTINCT ...

或者:

SELECT login_day, COUNT(*) 
FROM (
    SELECT DATE_FORMAT(login_time, '%D %M %Y') AS login_day, 
     user_id 
    FROM user_logins 
    WHERE login_time>DATE_SUB(NOW(), INTERVAL 1 MONTH) 
    GROUP BY DATE_FORMAT(login_time, '%D %M %Y'), 
     user_id 
) 
GROUP BY login_day