2016-09-20 13 views
1

Я довольно новичок в MySQL и с трудом выполняю сложный запрос. У меня есть две таблицыКак выбрать 10 самых популярных фильмов из базы данных?

стол Movie

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). Он в основном подсчитывает все строки. сделав таблицу рейтингов таблицы объединения только 1 строкой. То, что вы хотите, это GROUP BY его 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.movieid, чтобы получить количество
  • получение MAX COUNT не перечисляя Граф

Запрос (кол-во оценок):

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 (рейтинг)/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