SQL - 计算每个用户每天的登录次数

时间:2014-11-20 20:31:13

标签: mysql date counting

我有一个产生如下表格的查询:

Login_Date     Username
----------------------------------------------
1/1/10         user-1
1/1/10         user-1
1/1/10         user-2
1/2/10         user-1
1/2/10         user-2
1/3/10         user-1
1/3/10         user-1 
1/3/10         user-1
1/3/10         user-3

查询如下所示:

SELECT Date_Used, Name AS licenseNames FROM B, A WHERE A.License_Key = B.License_Key  ORDER BY Date_Used ;

这很好,但我需要它生成,是一个日期列表,每个日期它给我一个当天登录的用户列表,以及他们登录的次数。我已经我们全都试图找到一个简洁的解决方案,但这只是死路一条。

我想发布的结果如下所示:

Login_Date    Username    # of Times logged in
--------------------------------------------------
1/1/10       user-1       2
1/1/10       user-2       1
1/2/10       user-1       1
1/2/10       user-2       2
1/3/10       user-1       3
1/3/10       user-3       1

任何帮助都会非常感激,这让我感到疯狂。

修改

以下是各自的表格,以避免混淆:

表A列:

--------------------------
ID   License_Key    Name

表B栏:

------------------------------
ID    Date_Used     License_Key

编辑2

根据评论请求,到目前为止所有解决方案都在实际表中提供了相同的结果(尽管SQL Fiddle适用于所有这些,所以......?)

我得到的结果如下:

Login_Date     UserName     Cnt (or NumLogins for the other solution)
---------------------------------------------------------------------
01-01-10       user-1        1
01-01-10       user-1        1
01-01-10       user-2        1
01-02-10       user-1        1
01-02-10       user-1        1
01-02-10       user-1        1
01-02-10       user-1        1

等。所以它看起来像所有答案中的group by命令到目前为止只是做..没什么?很混乱...

3 个答案:

答案 0 :(得分:3)

您必须使用GROUP BY查询,并使用COUNT(*)聚合函数。由于Date_Used是DATETIME列,它可以包含DATE部分以及TIME部分,因此您必须使用DATE()函数仅提取DATE部分:

SELECT
  DATE(Date_Used),
  Name AS licenseNames,
  COUNT(*) AS logins
FROM
  B INNER JOIN A
  ON A.License_Key = B.License_Key
GROUP BY
  DATE(Date_Used),
  Name
ORDER BY
  DATE(Date_Used),
  Name

答案 1 :(得分:1)

这里需要实现的是COUNT()聚合函数。您可以将它与GROUP BY语句一起使用,它将计算组中存在的行数。

在您的情况下,您希望按用户和日期分组。我还建议您使用连接:

SELECT date_used, name AS licenseNames, COUNT(*) AS numLogins
FROM B
JOIN A ON a.license_key = b.license_key
GROUP BY date_used, name
ORDER BY date_used;

修改

这是SQL Fiddle。结果看起来与你的结果略有不同,但我认为你犯了一个错误,因为用户2只根据你所拥有的表在01/02/10登录过一次。

答案 2 :(得分:1)

我使用内连接和子查询来获取连接之前的计数来处理1:M关系;否则计数将被人为夸大。

我使用了聚合函数计数(*)和group by来获取按日期使用的license_keys计数

SELECT B2.Date_used as Login_date, A.name as UserName, B2.Cnt
FROM A
INNER JOIN 
(SELECT date_used, License_Key, count(*) cnt
FROM B
GROUP BY date_used, License_key) B2
ON A.License_key = B2.License_Key

我没有计算列名的别名,因为我不记得mysql的列的转义字符是......`或"或者[...我无法记住。