【问题标题】:Combining RIGHT JOIN with COUNT将 RIGHT JOIN 与 COUNT 相结合
【发布时间】:2013-03-22 02:39:40
【问题描述】:

我正在尝试获取每个用户在changes_cc 表中的条目数列表。并非所有用户都在其中输入了条目,但是由于某种原因,它为每个有 0 个条目的用户返回“1”。我假设这是因为它正在计算JOINed 表中的条目。我怎样才能让它变成“0”呢?

SELECT COUNT(*) as num, users.id, realname, username
            FROM changes_cc
            RIGHT JOIN users
                ON changes_cc.user_id = users.id
            GROUP BY users.id

【问题讨论】:

  • 尝试使用内连接
  • @JohnConde 只会显示有条目的用户。
  • 感谢您的所有回答。他们没事。我将不得不使用“eenie meenie miney moe”来决定接受谁;)

标签: mysql join


【解决方案1】:

我认为这应该可行 - 计算 changes_cc 表中的特定字段与计算 *:

SELECT u.id, realname, username, COUNT(c.id) as num
FROM users u 
    LEFT JOIN changes_cc c 
        ON u.user_id = c.id
GROUP BY u.id

我更喜欢阅读 LEFT JOIN 而不是 RIGHT JOIN,但它们都是 OUTER JOINs 并且工作方式相同。

【讨论】:

  • 我使用了与您建议的相同的查询,但是此查询仅返回两个表中的匹配数据。实际上,我想要用户表中的所有数据和更改计数,如果某个用户没有计数,我也想要该记录。
【解决方案2】:

您不应该使用COUNT(*)计算包括空值的记录),因为它通常会给出至少 1,因为它会返回正确表中的所有记录。如果您指定要计算的列名,它将为您提供所需的结果,因为COUNT 仅计入 NON_NULL 值。

SELECT  COUNT(changes_cc.user_id) as num, 
        users.id, 
        realname, 
        username
FROM    changes_cc
        RIGHT JOIN users
            ON changes_cc.user_id = users.id
GROUP   BY users.id

【讨论】:

    【解决方案3】:

    不要使用count(*),而是使用count(changes_cc.user_id)

    问题是您正在计算行数(使用*),而不是计算“右连接”表中的非 NULL 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 2021-03-15
      • 2023-02-10
      • 2018-11-12
      • 1970-01-01
      • 2019-06-03
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多