我正在尝试计算给定时间段内的登录次数,目前我的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;
答案 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个问题:
- 您的分组依据未列在您的列中
- 日期条件使用双引号。
尝试以下查询。
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;