2012-09-11 44 views
0

我有3個表格:Users,Friends,MoviesUser_MoviesMySQL - 從一個表中選擇COUNT from 2 others

UsersMovies只是用戶和電影的列表。

Friends剛剛2列:#fan_id#idol_id並且僅在那裏說 「用戶1以下用戶2」。

User_Movies有2列:#user_id#movie_id,是有說 「用戶擁有電影」。

好的。現在我想選擇每個用戶,他的朋友和他的電影的COUNT。我已經開始獲得朋友的數量,但我不知道如何獲得電影的數量。任何人都可以幫忙嗎?

SELECT u.`id`, u.`username`, COUNT(*) AS n_relation 
FROM `users` u 
JOIN `friends` f ON f.`idol_id` = u.`id` 
OR f.`fan_id` = u.`id` 
WHERE `username` = ? 
GROUP BY u.`id`;` 

謝謝你的幫助。

回答

1
select 
    u.*, 
    (select count(*) from friends f where f.idol_id = u.id) as fancount, 
    (select count(*) from user_movies m where m.user_id = u.id) as moviecount 
from 
    users u 
where 
    u.username = 'j.doe' 

替代,即可能更快(但你應該測試是否是在你的數據庫的情況下):

select 
    u.*, 
    uf.fancount, 
    um.moviecount 
from 
    users u 
    left join 
    (select 
     f.idol_id, count(*) as fancount 
    from friends f) uf on uf.idol_id = u.id 
    left join 
    (select 
     m.user_id, count(*) as moviecount 
    from user_movies m) um on um.user_id = u.id 
where 
    u.username = 'j.doe' 

第三個選項,看起來像你的嘗試和desimusxvii的,只有它使用distinct這可以「修復」計數問題,其中電影在有多個朋友時被多次計數,反之亦然。 但是,我會建議不要這個選項,因爲查詢不易讀和維護。它濫用group by而它不應該需要。

select 
    u.username, 
    count(distinct f.fan_id) as fancount, 
    count(distinct m.movie_id) as moviecount 
from 
    users u 
    left join friends f on f.idol_id = u.user_id 
    left join user_movies m on m.user_id = u.user_id 
where 
    u.username = 'j.doe' 
group by 
    u.username 
+0

謝謝。完善。但最後經過測試後,子查詢速度更快:/但iit幫助,謝謝。 – Max13