2013-03-22 85 views
1

我试图获取每个用户在changes_cc表中的条目数量列表。并非所有用户都已输入内容,但由于某些原因,每个拥有0个输入项的用户都返回“1”。我假设这是因为它正在计算JOIN ed表中的条目。我怎样才能让它变成“0”呢?将RIGHT JOIN和COUNT结合

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

尝试使用内部连接代替 – 2013-03-22 02:40:29

+1

@JohnConde只会显示具有条目的用户。 – Mike 2013-03-22 02:41:21

+1

感谢您的所有答案。他们都很好。我将不得不使用“eenie meenie miney moe”来决定接受谁;) – Mike 2013-03-22 02:43:49

回答

3

我认为这应该工作 - 算在changes_cc表中的特定字段VS计数*:

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 JOINRIGHT JOIN,但他们都OUTER JOINs和工作相同。

+1

我使用了与您所建议的相同的查询,但此查询只返回两个表中的匹配数据。 其实,我想从用户表中的所有数据和更改的计数,如果某些用户没有计数,也是我想要的记录。 – 2016-12-29 06:52:30

2

你不应该使用COUNT(*)罪名包括空值记录),因为它通常会给予ATLEAST 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 
1

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

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