SQL- Anfrage?
Hi, also erstmal ich hab diese Aufgabe :
- Geben Sie zu jedem Film aus dem Jahr 2000 id, Namen sowie die Anzahl der Rollen (benannt Anzahl) aus und sortieren Sie die Liste absteigend nach Anzahl der Rollen. Stellen Sie dabei sicher, dass auch Filme ohne Rollen richtig gelistet sind.
Wir haben einen Table "movies" mit den Attributen : "name", "year", "rank", "id" und einen Table "roles" mit den Attributen : "actor_id", "movie_id", "role"
Nun wäre meine Lösung:
SELECT id, name, count(role) AS Anzahl
FROM movies m LEFT JOIN roles r ON m.id = r.movie_id
Where year = 2000
GROUP BY id, name
Erstmal passt meine Erklärung:
Ich hab einen Left join genommen um auch die Tupel aus dem table movies zu bekommen die keine Rollen haben (in der Aufgabe nachgefragt ) . Daraufhin hab ich pro Film die Rollen gezählt und dann mit group by die Duplikate entfernt.
Hier eine kleine Verständnisfrage: Warum muss ich mit id, name sortieren ?
Erstmal passt meine Erklärung:
Natürlich sollte das eine Frage sein ;)
1 Antwort
Vor id und name steht "group by" du sortierst damit also nicht, sondern du gruppierst. Das musst du machen, weil in einer gruppierten Abfrage für jede Spalte etwas passieren muss. Also jede Spalte muss entweder gruppiert werden oder das Ergebnis einer Aggregatfunktion (count, sum etc.) sein.
Die eigentliche Sortierung (ORDER BY) hast du noch gar nicht drinstehen.
Ja, nur wenn du gruppierst oder eine Aggregatfunktion verwendest. Wobei ich meine, dass irgendein Datenbanksystem, mit dem ich mal gearbeitet hab, einfach den erstbesten Wert genommen hat, wenn man nach einer Spalte nicht gruppiert hat. Das ist aber ziemlich fehleranfällig.
Ah ok, danke. Mir ist grad aufgefallen, wenn ich die Anzahl berechne , wie sortier ich diese dann ?
Wenn dein Datenbanksystem kein "ORDER BY Anzahl DESC" akzeptiert, dann mit "ORDER BY count(role) DESC"
ah ok, da ist mein problem. Ich hatte ORDER BY Anzahl DESC. Macht aber ja kein sinn, weil die Spalte "existiert " ja noch nicht. Ist es nicht etwas ineffizient , wenn man zweimal zählen muss?
Ah stimmt. Hab es verwechselt mit Order by
Aber nur wenn ich gruppiere?
Oh stimmt muss ich noch ergänzen