2013-08-28 94 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