我希望此查询显示所有用户,无论如何。并计算在特定时间段内发生的登录次数(如果没有条目,则只返回零)。
现在,它只显示在该时间段内日志中有条目的用户。
SELECT
COUNT(user_log.type) AS logins,
users.name,
users.email,
users.user_id
FROM
users
LEFT JOIN
user_log
ON
users.user_id = user_log.user_id
WHERE
user_log.type = 8
AND
user_log.date >= :from
AND
user_log.date <= :to
GROUP BY
users.user_id
user_log.type = 8表示日志条目是登录
:from是一个带有开始日期的时间戳
:to是带有结束日期的时间戳
我使用PDO
答案 0 :(得分:0)
如果在第二个表上使用where约束并使用LEFT JOIN,那么您将使用与使用INNER JOIN相同的结果,因为您不允许NULL值。
这是您可以尝试使用子请求的解决方案:
SELECT users.name,
users.email,
users.user_id,
IF (logins IS NOT NULL, logins, 0) AS logins
FROM users
LEFT JOIN (
SELECT user_id, COUNT(type) AS logins
FROM user_log
WHERE
type = 8
AND
date >= :from
AND
date <= :to
GROUP BY
user_id
) AS l ON l.user_id = users.user_id
答案 1 :(得分:0)
首先,您正在滥用有害的MySQL扩展程序GROUP BY
。你将很难调试。所以你需要GROUP BY users.name, users.email. users.id
。
使用LEFT JOIN
条款中WHERE
ed表中的项目编写查询的方式会将LEFT JOIN
转换为INNER JOIN
。所以你从第一张桌子上丢失了无法比拟的行。
将这些WHERE
项移到ON
子句中,事情就会按照您想要的方式运行。像这样。
SELECT
COUNT(user_log.type) AS logins,
users.name,
users.email,
users.user_id
FROM users
LEFT JOIN user_log
ON (
users.user_id = user_log.user_id
AND
user_log.type = 8
AND
user_log.date >= :from
AND
user_log.date <= :to
)
GROUP BY
users.name, users.email. users.id