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)
我知道这是错误的,这将返回所有登录仅从当前月初开始并没有按对他们正确分组。有关如何做到这一点的方向将不胜感激。谢谢
答
您需要使用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子句。
答
正如马克建议你可以使用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
你的WHERE子句似乎是从你的问题问什么不同的哪一个是正确的 - 在WHERE子句。查询或问题? – 2010-08-18 11:01:35
的问题,我知道查询是错误 – IamBanksy 2010-08-18 11:03:28
我需要更改查询来做我在描述的问题 – IamBanksy 2010-08-18 11:03:47