2014-10-07 57 views
0

我有两个表。一个用于movies(其中列出id,movie_title,movie_director等)和其他是likes表:它跟踪有多少人已经将任何特定电影添加到他们的收藏夹。它只有两个字段movie_id, user_id。两者均来自相应表格(moviesusers)的foreign key referencesMYSQL子查询内部连接顺序的计数

现在我想要显示按大部分喜欢排序的所有电影。

所以我必须使用选择查询,并在里面我必须通过子查询命令它计数每个电影喜欢的数量。

这样的事情?

select * 
from movies 
inner join likes 
on movies.id=likes.movie_id 
order by (
    select count * 
    from likes 
    where movie_id=? 
) 

我真的被困在这里。喜欢的表有这样

user_id 1,movie_id 2, user_id 2, movie_id 2 

结构,选择在别人面前我应该得到电影ID 2,因为它有2所喜欢的时候。

但是怎么做呢?

Ahmar。

回答

1

你可以用你开始的子查询方法来做到这一点。关键是删除外部联接,并使用相关的子查询:

select * 
from movies 
order by (select count(*) 
      from likes 
      where movies.id = likes.movie_id 
     ) desc; 
+0

那正是我想要的:) – 2014-10-07 18:51:25

4

你必须计数来算喜欢和排序:

select m.id, 
     m.movie_title, 
     m.movie_director, 
     count(l.movie_id) as num_likes 
    from movies m 
    left join likes l 
    on m.id = l.movie_id 
group by m.id, m.movie_title, m.movie_director 
order by num_likes desc 

这将降序这样做(最喜欢的第一个)

+0

您可能希望使用LEFT JOIN不会失去所有不喜欢的电影。 – 2014-10-07 18:16:52

+0

@JoachimIsaksson好点,改为 – 2014-10-07 18:18:30

+0

'count(ifnull(l.movi​​e_id,0))'当'l.movi​​e_id'为空时会返回1。 'count(l.movi​​e_id)'应该足够了 – FuzzyTree 2014-10-07 18:22:06

1

你可以用一组由语句实现这一目标。

select m.id, count(*) as POPULARITY 
from movies m inner join likes l on m.id = l.movie_id 
group by m.id 
order POPULARITY desc; 

根据以上评论,这将排除没有喜欢的电影。但更好地开始简单。