1

我正在尝试获取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
4

3 回答 3

3

我认为这应该可行——计算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

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

于 2013-03-22T02:41:08.840 回答
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
于 2013-03-22T02:41:01.977 回答
1

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

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

于 2013-03-22T02:41:19.280 回答