2013-08-28 43 views
0

我想写一个SQL查询,为每个用户返回一行。该行必须包含分配给该用户的学校计数以及分配给该用户的所有学校中的分数总和。从关联的表中选择行数无子选择

表:

users (id, email) 
schools (id, user_id, points (int)) 

关系usersschools是一个一对多的。

我这个地步得到:

select u.id, u.email, 
    count(*) as total_schools, 
    sum(points) as total_points 
from users u 
left join schools s 
    on u.id = s.user_id 
group by u.id 

但是这完全不是那么回事。 count(*) as total_school是错误的。它返回用户行的数量,而不是分配的学校行的数量。

我该如何得到这个数字?

+1

再次检查结果。它应该返回分配的学校数量,除非用户没有分配学校。如果用户可以多次分配到学校,请将COUNT(*)改为COUNT(s.user_id)或COUNT(DISTINCT s.id)。 –

回答

1

在学校表中是id/user-id对唯一吗?如果不是这样,那么您可能会返回用户出现在学校的次数。

尝试使用不同的计数()。虽然请注意,在不计数的情况下,空值将被省略()。

select u.id, u.email, 
    count(distinct(s.id)) as total_schools, 
    sum(points) as total_points 
from users u 
left join schools s 
    on u.id = s.user_id 
group by u.id 

sqlfiddle