2014-10-07 65 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; 

根據以上評論,這將排除沒有喜歡的電影。但更好地開始簡單。