【问题标题】:Returning all rows with count(*), including count(*)=0 [duplicate]返回所有带有 count(*) 的行,包括 count(*)=0 [重复]
【发布时间】:2018-10-05 22:27:36
【问题描述】:

在存储过程中,我创建并填充了一个临时表 (tmpAllUsers),其列是 user_id (int)、first_name (varchar) 和 last_name (varchar)。在数据库中,我有另一个表(Actions),记录用户每次完成特定操作的时间。该表的列是 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,但出现了不重用临时表的相同问题。

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果我理解正确,您还想包括没有符合内部查询限制的操作的用户,在这种情况下,您可以使用 LEFT JOIN 并且当 actionCountNULL,替换为 ZERO,如下所示:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2020-12-22
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多