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是错的。它返回用户行数,而不是分配的学校行数。

我怎么得到这个数?

4

1 回答 1

1

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

尝试使用 distinct 而不是 count( )。尽管注意 null 将被省略,而不是 count( )。

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

于 2013-08-28T23:10:01.257 回答