GrandmasterA: Hilfe bei mySQL-Statement für Top 50

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

  1. 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

    1. 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

      1. 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

        1. 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

        2. Der Fehler scheint beim "ORDER BY SUM(points)" zu liegen

          1. 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

            1. 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