返回所有带有count(*)的行,包括count(*)= 0

时间:2018-10-05 22:27:36

标签: mysql

在存储过程中,我创建并填充一个临时表(tmpAllUsers),其列为user_id(int),first_name(varchar)和last_name(varchar)。在数据库中,我还有另一个表(操作),该表记录用户每次完成特定操作时的情况。该表的列是user_id(int),action(int)和actionDate(datetime)。

要显示用户在某个时间范围内已完成的操作数量很容易:

SELECT first_name, last_name, actionCount
FROM tmpAllUsers
INNER JOIN (
    SELECT user_id, count(*) as actionCount
    FROM Actions
    WHERE action = 1 and
        actionDate >= @sDate and actionDate < @eDate
    GROUP BY user_id ) x
ON tmpAllUsers.user_id = x.user_id;

挑战在于返回一个包含所有用户的表,包括actionCount = 0的用户。我尝试的第一种方法使用联合,但是在MySQL中,临时表不能在同一查询中使用两次。我的第二个想法是使用OUTER JOIN,但是出现了不重用临时表的问题。

您能建议一种可行的方法吗?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您还希望包括没有与内部查询的限制相匹配的操作的用户,在这种情况下,您可以使用 LEFT JOIN ,当 > actionCount NULL ,替换为,如下所示:

SELECT
    first_name,
    last_name,
    IFNULL(actionCount, 0)
FROM
    tmpAllUsers
LEFT JOIN (
    SELECT user_id, count(*) AS actionCount
    FROM Actions
    WHERE action = 1 AND actionDate >= @sDate AND actionDate < @eDate
    GROUP BY user_id ) x ON tmpAllUsers.user_id = x.user_id;