MySQL查询有助于分组和添加

时间:2010-08-18 10:51:41

标签: mysql

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

我知道这是错误的,这只会从当月开始返回所有登录,并且不会正确分组。关于如何做到这一点的一些方向将不胜感激。谢谢

2 个答案:

答案 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