显示结果也没有计数/零

时间:2019-11-05 08:37:30

标签: mysql sql

我正在尝试计算给定时间段内的登录次数,目前我的SQL查询仅显示至少登录一次的结果,我希望它甚至显示登录次数为零的结果。

我正在使用的查询:

SELECT c.FullName, COUNT(l.Id) 
FROM LoginsTable l JOIN UsersTable u ON u.Email = l.Email JOIN Organisations c ON c.Id = u.OrganisationId 
WHERE l.AttemptTime > "2019-10-01" AND l.AttemptTime < "2019-11-01" AND l.Success = 1 
GROUP BY c.Name
ORDER BY c.Name ASC;

3 个答案:

答案 0 :(得分:2)

您遇到了一些问题。首先,您需要使用RIGHT JOIN中的LoginsTable或对JOIN进行重新排序以将JOIN放在LoginsTable的最后,然后使用{{1} }。考虑到查询的性质,后者可能更有意义。 其次,您需要在已LEFT JOIN设置为联接条件的表中的字段上放置任何条件,否则MySQL会将LEFT JOIN转换为LEFT JOIN(请参阅{{3} }。最后,您应该INNER JOIN GROUP BY中的相同字段。这应该起作用:

SELECT

答案 1 :(得分:0)

我在这里发现2个问题:

  
      
  1. 您的分组依据未列在您的列中
  2.   
  3. 日期条件使用双引号。
  4.   

尝试以下查询。

SELECT c.FullName, COUNT(l.Id) 
FROM LoginsTable l 
LEFT JOIN UsersTable u ON u.Email = l.Email 
LEFT JOIN Organisations c ON c.Id = u.OrganisationId 
WHERE l.AttemptTime between '2019-10-01' AND '2019-11-01' AND l.Success = 1 
GROUP BY c.FullName
ORDER BY c.FullName ASC;

答案 2 :(得分:0)

正如罗曼·霍克(Roman Hocke)所说,您需要按如下方式使用左连接:

SELECT c.FullName, COUNT(l.Id) 
FROM UsersTable u
JOIN Organisations c ON c.Id = u.OrganisationId 
LEFT JOIN LoginsTable l ON u.Email = l.Email 
WHERE l.AttemptTime > "2019-10-01" AND l.AttemptTime < "2019-11-01" AND l.Success = 1 
GROUP BY c.Name
ORDER BY c.Name ASC;

此外,您应该使用以下字段来修复组或选择该字段:SELECT c.Name或GROUP BY c.FullName ORDER BY c.FullName

编辑:尼克的答案就是一个。正如他所说的很好,您需要将条件放在左联接的on子句中。

SELECT c.FullName, COUNT(l.Id) 
FROM UsersTable u
JOIN Organisations c ON c.Id = u.OrganisationId 
LEFT JOIN LoginsTable l ON (u.Email = l.Email AND l.AttemptTime > "2019-10-01" AND l.AttemptTime < "2019-11-01" AND l.Success = 1)
GROUP BY c.FullName
ORDER BY c.FullName ASC;