2016-09-20 1 views
1

Ich bin ziemlich neu in MySQL und habe es schwer, eine komplexe Abfrage auszuführen. Ich habe eine zwei TabellenWie wählt man die 10 besten Filme aus einer Datenbank aus?

Film Tisch

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

Bewertungen Tabelle

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

ich die Top 10 der am meisten bewertet Filmtitel erhalten möchten; Dies ist, wie weit ich mit der Abfrage bekam:

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

ich immer nur 1 als Antwort bekommen.

+0

sollte ---> LIMIT 10 –

Antwort

1

Das Problem wird von COUNT(movieid) verursacht. Es zählt im Grunde alle Zeilen. die Bewertungsseite des Joins wird nur 1 Zeile lang gemacht. Was Sie wollen, ist GROUP BY es von movieid, so dass Sie eine separate Bewertung Anzahl für jeden MovieID erhalten.

try this:

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

Ich erhalte einige 'Jede abgeleitete Tabelle muss seine eigene alias' Fehler – Auro

+1

einfach haben musste' AS r' hinzufügen, nachdem der 'JOIN' geschlossen. Danke .. – Auro

0

Es gibt zwei fehlende Punkte:

  • Gruppierung durch die movie.movieid die Zählung
  • bekommt den MAX zu erhalten Zählen Sie die Zählung nicht Auflistung

Abfrage (Anzahl der Bewertungen):

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

Query (durchschnittliche Bewertung)

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

Wird das die Top 10 zurückgeben? – Auro

+0

Top-10-Filme, die die maximale Anzahl der Preise hat, aber wenn Sie nach der durchschnittlichen Bewertung sortieren möchten, müssen Sie MAX (COUNT (*)) zu MAX (SUM (Bewertungen.Rating)/COUNT (*)) –

+0

Es gab ein Problem mit der Abfrage, jetzt aktualisiert –

1

OUTER JOIN ist hier nicht erforderlich.

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 
Verwandte Themen