即使没有用户日志条目,也检索所有用户

时间:2014-10-01 12:06:36

标签: mysql pdo left-join

我希望此查询显示所有用户,无论如何。并计算在特定时间段内发生的登录次数(如果没有条目,则只返回零)。

现在,它只显示在该时间段内日志中有条目的用户。

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

2 个答案:

答案 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