我有一个产生如下表格的查询:
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命令到目前为止只是做..没什么?很混乱...
答案 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的列的转义字符是......`或"或者[...我无法记住。