2016-09-20 44 views
1

我對MySQL很陌生,而且很難運行復雜的查詢。 我有兩個表如何從數據庫中選擇評分最高的前10名電影?

電影臺

CREATE TABLE movies (movieid int(4) NOT NULL PRIMARY KEY, 
title varchar(255) NOT NULL, 
genres varchar(255) NOT NULL); 

評分表

CREATE TABLE ratings (userid int(4) NOT NULL, movieid int(4) NOT NULL, 
rating int(1) NOT NULL, timestamp int(10) NOT NULL ADD CONSTRAINT FK_ratings 
FOREIGN KEY(movieid) REFERENCES movies(movieid)); 

我想要得到的前10名最受好評的電影片名; 這是我在多大程度上與查詢得到:

SELECT title 
FROM movie m 
JOIN (
SELECT movieid, COUNT(movieid) 
FROM ratings) 
ON m.movieid = r.movieid 
LIMIT BY 10 

我一直得到只是1作爲響應。

+0

應該是---> LIMIT 10 –

回答

1

問題是由COUNT(movieid)造成的。它基本上統計所有的行。使連接的收視表一邊只有一排。你想要的是GROUP BY它由movieid,所以你得到每個movieid單獨的評級數。

試試這個:

SELECT title 
FROM movie m 
JOIN (
SELECT movieid, COUNT(movieid) 
FROM ratings GROUP BY movieid) 
ON m.movieid = r.movieid 
LIMIT 10 
+0

我得到一些'每個派生的表必須有自己的alias'錯誤 – Auro

+1

就不得不添加'AS r'後'JOIN'關閉。謝謝.. – Auro

0

有兩名失蹤點:

  • 分組由movie.movi​​eid得到計數
  • 獲得最大計數未上市的數

查詢(評分數):

SELECT movies.title, (SELECT COUNT(*) FROM ratings 
WHERE ratings.movieid = movies.movieid) AS raters 
FROM movies ORDER BY raters DESC LIMIT 10 

查詢(平均評分)

SELECT movies.title, (SELECT SUM(ratings.rating)/COUNT(*) FROM ratings 
WHERE ratings.movieid = movies.movieid) AS raters 
FROM movies ORDER BY raters DESC LIMIT 10 
+0

這是否會回到前10名? – Auro

+0

排名前10的電影有最大數量的費率,但如果您想根據平均評分進行排序,您必須將MAX(COUNT(*))更改爲MAX(SUM(ratings.rating)/ COUNT(*)) –

+0

查詢現在有更新的問題 –

1

OUTER JOIN是沒有必要在這裏。

SELECT m.title, SUM(r.rating)/COUNT(m.movieid) 
FROM movies m 
INNER JOIN ratings r ON m.movieid = r.movieid 
GROUP BY m.movieid 
ORDER BY 2 DESC 
LIMIT 0, 10 
相關問題