0

Users、、、の3つのテーブルがFriendsありMoviesますUser_Movies

UsersMoviesは、ユーザーと映画の単なるリストです。

Friends列は2つだけです:#fan_id#idol_id「ユーザー1がユーザー2の後に続く」とだけ表示されます。

User_Movies2つの列があります:#user_id#movie_id「ユーザーは映画を持っています」と言うことがあります。

Ok。今、私はすべてのユーザー、彼の友人と彼の映画の数を選択したいと思います。友達の数を取得し始めましたが、映画の数も取得する方法がわかりません。誰か助けてもらえますか?

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`;`

ご協力ありがとうございました。

4

1 に答える 1

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'

3番目のオプションは、あなたの試みと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
于 2012-09-11T20:53:12.037 に答える