MySQL查询帮助分组和添加

MySQL查询帮助分组和添加

问题描述:

我有一个名为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

您需要使用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

正如马克建议你可以使用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