我正在尝试获取每个用户在changes_cc
表中的条目数列表。并非所有用户都对其进行了输入,但由于某种原因,对于每个有0个条目的用户,它返回“1”。我假设这是因为它正在计算JOIN
ed表中的条目。我怎样才能使它变为“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
答案 0 :(得分: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
我更喜欢在LEFT JOIN
上阅读RIGHT JOIN
,但它们都是OUTER JOINs
并且工作原理相同。
答案 1 :(得分: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
答案 2 :(得分:1)
不使用count(*)
,而是使用count(changes_cc.user_id)
。
问题在于您计算行数(使用*
)而不是计算“右连接”表中的非NULL值。