Hilfe bei mySQL-Statement für Top 50
GrandmasterA
- datenbank
Hallo zusammen,
auf meiner Webseite kann man seine persönliche Film-Top-10 anlegen. Die einzelnen Datensätze werden folgendermaßen in der Datenbank gespeichert:
ID
USER_ID
MOVIE_ID
POSITION
POINTS
Jeder Nutzer kann nun seine Top anlegen, wobei jeder Platz einen Datensatz bekommt. Die jeweilige Nummer 1 des Nutzers erhält eine 1 bei POSITION und eine 10 bei POINTS, die Nummer 2 eine 2 bei POSITION und eine 9 bei POINTS und immer so weiter.
Nun hat quasi jeder Film mit einer MOVIE_ID eine gewisse Summe an POINTS. Je nachdem, wieviele Leute diesen Film recht weit oben in ihrer Top 10 angegeben haben.
Daraus möchte ich nun eine Top-50 aller Filme erstellen lassen.
Ich will quasi die MOVIE_IDs nacheinander ausgeben, sortiert nach der Summe der POINTS und für jeden Film immer nur 1x.
Nun kann es jedoch vorkommen, dass mehrere Filme die gleiche Anzahl an Gesamtpunkten haben. Diese möchte ich jedoch auf der gleichen Position anzeigen. Ein LIMIT von 50 kann daher eigentlich nicht vergeben werden. Und da wird´s für mich persönlich etwas zu kompliziert.
Das Ergebnis soll so aussehen:
PLATZ FILM
1 Film A
2 Film B
Film C
3 Film D
4 Film E
5 Film F
Film G
Film H
6 Film I
7 Film J
. .
. .
. .
50 Film XY
Soweit erstmal für den Anfang. Leider hab ich keinen wirklichen Ansatz für das SQL-Statement. Ich würde am liebsten alles in einem Statement abhandeln. Notfalls dürfen es aber auch mehrere sein, wenn´s nicht anders geht.
Punkt 2 wäre dann noch, die Position eines Filmes innerhalb der Tabelle zu ermitteln, wenn man nur die MOVIE_ID hat. Also Quasi "Dieser Film ist auf Platz 3 der Top-50"... Aber dazu vielleicht erst, wenn der erste Teil funktioniert.
Bin für jeden Tipp/Ansatz dankbar.
Gruß,
Andreas
Hallo Andreas,
welche MySQL-Version? Ab 5.x ist das komplett in SQL machbar.
Nun kann es jedoch vorkommen, dass mehrere Filme die gleiche Anzahl an Gesamtpunkten haben. Diese möchte ich jedoch auf der gleichen Position anzeigen. Ein LIMIT von 50 kann daher eigentlich nicht vergeben werden. Und da wird´s für mich persönlich etwas zu kompliziert.
Soweit erstmal für den Anfang. Leider hab ich keinen wirklichen Ansatz für das SQL-Statement. Ich würde am liebsten alles in einem Statement abhandeln. Notfalls dürfen es aber auch mehrere sein, wenn´s nicht anders geht.
Ermittle die Punktzahl, die für den 50. Platz benötigt wird.
Du benötigst alle Datensätze, die mindestens soviele Punkte haben.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
welche MySQL-Version? Ab 5.x ist das komplett in SQL machbar.
Schade: MySQL 4.0.23
Ermittle die Punktzahl, die für den 50. Platz benötigt wird.
Du benötigst alle Datensätze, die mindestens soviele Punkte haben.
Das ist schonmal ein guter Ansatz.
Mir fehlt leider noche einer, wie ich nach den Gesamtpunkten sortiere, die ein einzelner Film hat.
Gruß,
Andreas
Hallo Andreas,
welche MySQL-Version? Ab 5.x ist das komplett in SQL machbar.
Schade: MySQL 4.0.23
oh je. Das ist eine ganz schlechte Nachricht. MySQL 4.0.x kann noch nicht einmal
Subselects.
Ermittle die Punktzahl, die für den 50. Platz benötigt wird.
Du benötigst alle Datensätze, die mindestens soviele Punkte haben.Das ist schonmal ein guter Ansatz.
Mir fehlt leider noche einer, wie ich nach den Gesamtpunkten sortiere, die ein einzelner Film hat.
ID
USER_ID
MOVIE_ID
POSITION
POINTS
SELECT -- Gib mir
MOVIE_ID, -- die ID des Films
SUM(POINTS) AS Punkte -- und die Summe seiner Punkte
FROM
deine_tabelle -- aus Deiner Tabelle
GROUP BY -- und gruppiere (d.h. fasse zusammen) nach
MOVIE_ID -- der ID der Filme
ORDER BY
SUM(POINTS) DESC -- Sortiere absteigend nach der Gesamtpunktzahl
-- In MySQL kannst Du hier auch den Spaltenalias
-- verwenden
siehe MySQL-Handbuch:
GROUP-BY-Funktionen
Probleme mit Aliasnamen
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
danke schonmal für Deine Hilfe.
oh je. Das ist eine ganz schlechte Nachricht. MySQL 4.0.x kann noch nicht einmal
Subselects.
Ja, das habe ich auch schon merken müssen.
> SELECT -- Gib mir
> MOVIE_ID, -- die ID des Films
> SUM(POINTS) AS Punkte -- und die Summe seiner Punkte
> FROM
> deine_tabelle -- aus Deiner Tabelle
> GROUP BY -- und gruppiere (d.h. fasse zusammen) nach
> MOVIE_ID -- der ID der Filme
> ORDER BY
> SUM(POINTS) DESC -- Sortiere absteigend nach der Gesamtpunktzahl
> -- In MySQL kannst Du hier auch den Spaltenalias
> -- verwenden
So ähnlich sah mein erster Versuch auch aus. Allerdings wirft es eine Fehlermeldung "#1111 - Invalid use of group function".
Gruß,
Andreas
Der Fehler scheint beim "ORDER BY SUM(points)" zu liegen
Der Fehler scheint beim "ORDER BY SUM(points)" zu liegen
Ah, "ORDER BY punkte" geht ;)
Danke für den Ansatz... ich probier erstmal allein weiter.
Gruß,
Andreas
So, habe es hinbekommen.
Vielen Dank nochmal an Vinzenz!
Habe es nun doch so gemacht, dass sich nicht mehrere Filme eine Position teilen, sonst werden es am Ende mehr als 50 Filme. Stattdessen wird neben den Gesamtpunkten auch noch betrachtet, wieviele Leute zu diesen Punkten beigetragen haben (je weniger, desto besser).
Falls es jemanden interessiert... Das Ergebnis gibt es hier:
Filme - Top 50
Serien - Top 50
Werde evtl. noch ein kleines bisschen dran feilen, aber im großen und ganzen ist es schon so ziemlich das, was ich mir vorgestellt habe :)
Danke nochmal,
Andreas