我有一个名为user_logins的表,用于跟踪用户登录系统。它有三列,login_id,user_id和login_time
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
结果表2010-8-16中的只有3,因为user_id 9当天登录了两次并且他登录系统只计为当天的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 :(得分: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子句。
答案 1 :(得分: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