Steffen: Ranking-Funktion bei MySQL?

Hi Ihr,

habe ein kleines Problem. Ich möchte einer Art-Ranking-Abfrage in MySQL realisieren.

In der Datenbank steht immer eine Zahl und ein Username
345 | user1
23 | user2
4483 | user3
3 | user4
321 | user5

Nun möchte ich zum Username den Platz (also das Ranking ermitteln), für user1 wäre das z.B. die 3, für user3 die 1, für user4 die 5. Hat jemand einen Tipp, mit was für einer Query ich das hinberkomme?

Vielen Dank.

Liebe Grüße,
Steffen

  1. In der Datenbank steht immer eine Zahl und ein Username
    345 | user1
    23 | user2
    4483 | user3
    3 | user4
    321 | user5

    Nun möchte ich zum Username den Platz (also das Ranking ermitteln), für user1 wäre das z.B. die 3, für user3 die 1, für user4 die 5. Hat jemand einen Tipp, mit was für einer Query ich das hinberkomme?

    Hi, ich mach das immer so ungefähr
    $rang=1
    $result = mysql_query("SELECT user, punkte FROM user WHERE ORDER by punkte");
          while ($row = mysql_fetch_array($result))
      {
             $user  = $row['user'];
                            $punkte  = $row['punkte'];
    echo" $rang, $user, $punkte";
    $rang++;

    }

    1. Hallo,

      Hi, ich mach das immer so ungefähr
      $rang=1
      $result = mysql_query("SELECT user, punkte FROM user WHERE ORDER by punkte");
            while ($row = mysql_fetch_array($result))
        {
               $user  = $row['user'];
                              $punkte  = $row['punkte'];
      echo" $rang, $user, $punkte";
      $rang++;

      }

      Ich hatte die selbe Idee. Die SQL-Abfrage dann aber ohne das WHERE, oder?! ;)

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    2. Hallo,

      Hi, ich mach das immer so ungefähr
      $rang=1
      $result = mysql_query("SELECT user, punkte FROM user WHERE ORDER by punkte");
            while ($row = mysql_fetch_array($result))
        {
               $user  = $row['user'];
                              $punkte  = $row['punkte'];
      echo" $rang, $user, $punkte";
      $rang++;

      }

      Ich hatte die selbe Idee. Die SQL-Abfrage dann aber ohne das WHERE, oder?! ;)

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    3. Hi Oke,

      hmm, genauso wollte ich das nicht machen. Die User werden auch nicht in einer Tabelle alle ausgegeben, sondern es soll das Ranking des Users im Profil angezeigt werden... also quasi nur 1 User.

      Zudem denke ich, dass deine Methode bei vielen Usern (über 1 Mio.) für die Performance nicht soo optimal wäre.

      Noch eine Idee? Danke dir trotzdem.

      Liebe Grüße,
      Steffen

      In der Datenbank steht immer eine Zahl und ein Username
      345 | user1
      23 | user2
      4483 | user3
      3 | user4
      321 | user5

      Nun möchte ich zum Username den Platz (also das Ranking ermitteln), für user1 wäre das z.B. die 3, für user3 die 1, für user4 die 5. Hat jemand einen Tipp, mit was für einer Query ich das hinberkomme?

      Hi, ich mach das immer so ungefähr
      $rang=1
      $result = mysql_query("SELECT user, punkte FROM user WHERE ORDER by punkte");
            while ($row = mysql_fetch_array($result))
        {
               $user  = $row['user'];
                              $punkte  = $row['punkte'];
      echo" $rang, $user, $punkte";
      $rang++;

      }

  2. Hallo,

    habe ein kleines Problem. Ich möchte einer Art-Ranking-Abfrage in MySQL realisieren.

    In der Datenbank steht immer eine Zahl und ein Username
    345 | user1
    23 | user2
    4483 | user3
    3 | user4
    321 | user5

    SQL bringt doch ORDER BY mit. Mit DESC wird dann auch rückwärts sortiert. Dann hast du halt user3, user5, user1, user2, user4 in deiner Ausgabe und kannst denen aufsteigend ein Ranking verpassen.

      
    $i = 1;  
    while ($row = mysql_fetch_array($result)) {  
        echo "Rang ".$i.". ".$row['user'];  
        $i++;  
    }  
    
    

    So würde ich da naiv wie ich bin rangehen.

    Gruß,
    Leeloo

    --
    "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    1. Hi Oke,

      hmm, genauso wollte ich das nicht machen. Die User werden auch nicht in einer Tabelle alle ausgegeben, sondern es soll das Ranking des Users im Profil angezeigt werden... also quasi nur 1 User.

      Zudem denke ich, dass deine Methode bei vielen Usern (über 1 Mio.) für die Performance nicht soo optimal wäre.

      Noch eine Idee? Danke dir trotzdem.

      Liebe Grüße,
      Steffen

      Hallo,

      habe ein kleines Problem. Ich möchte einer Art-Ranking-Abfrage in MySQL realisieren.

      In der Datenbank steht immer eine Zahl und ein Username
      345 | user1
      23 | user2
      4483 | user3
      3 | user4
      321 | user5

      SQL bringt doch ORDER BY mit. Mit DESC wird dann auch rückwärts sortiert. Dann hast du halt user3, user5, user1, user2, user4 in deiner Ausgabe und kannst denen aufsteigend ein Ranking verpassen.

      $i = 1;
      while ($row = mysql_fetch_array($result)) {
          echo "Rang ".$i.". ".$row['user'];
          $i++;
      }

      
      >   
      > So würde ich da naiv wie ich bin rangehen.  
      >   
      > Gruß,  
      > Leeloo
      
  3. n'abend,

    Nun möchte ich zum Username den Platz (also das Ranking ermitteln), für user1 wäre das z.B. die 3, für user3 die 1, für user4 die 5. Hat jemand einen Tipp, mit was für einer Query ich das hinberkomme?

    für eine Gesamtausgabe wurde dir bereits gesagt, dass du dies am Besten in der Programmiersprache deiner Wahl machst. Für eine Abfrage eines einzelnen Users (d)ein Ranking zu ermitteln ist nicht machbar. Du müsstest dennoch die Tabelle sortieren und solange durchlaufen, bis du deinen user gefunden hast.

    Du kannst dir den Rang eines Users in einer eigenen Spalte merken und diese ab und an aktualisieren. Andere Möglichkeiten sehe ich hier leider nicht, es sei denn du kannst aus deiner Zahl irgendwie den Rang errechnen.

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
    1. Hallo globe,

      für eine Gesamtausgabe wurde dir bereits gesagt, dass du dies am Besten in der Programmiersprache deiner Wahl machst.

      das ist nicht erforderlich.

      Für eine Abfrage eines einzelnen Users (d)ein Ranking zu ermitteln ist nicht machbar.

      Das ist je nach vorhandener MySQL-Version sehr wohl machbar.
      Der erste Schritt besteht in der Berechnung des Ranges. Das wurde hier im Forum bereits mehrfach besprochen und ist durch den Einsatz von Benutzervariablen lösbar.

      set @a = 0;  
      SELECT  
          @a := (@a + 1) rang,  
          benutzer,  
          zahl  
      FROM tabelle  
          ORDER BY zahl;  
      
      

      Nun hätte Steffen das ganze gern nach user sortiert:

      set @a = 0;  
      SELECT  
          r.benutzer,  
          r.zahl,  
          r.rang  
      FROM ( SELECT  
          @a := (@a + 1) rang,  
          benutzer,  
          zahl  
      FROM tabelle ) r  
      ORDER BY r.benutzer  
      
      

      sollte es ab MySQL 4.1.x tun. Ein Index auf die Spalte zahl ist wichtig, dann bleibt nur das Sortieren nach der Spalte benutzer im äußeren Query als Performanceproblem übrig. MySQL 4.1.x wird für das Subselect benötigt, das Setzen der Benutzervariablen muss in der gleichen Verbindung erfolgen.

      Freundliche Grüße

      Vinzenz

      1. n'abend,

        das ist nicht erforderlich.

        aber sinnvoll, da er die Ergebnismenge der Query sowieso durchlaufen muss. Der Subselect an dieser Stelle ist zwar etwas an was ich zugegebener Maßen nicht gedacht habe, jedoch bedeutet er einen unnötigen Mehraufwand. (Für eine Gesamtausgabe)

        Für eine Abfrage eines einzelnen Users (d)ein Ranking zu ermitteln ist nicht machbar.

        Das ist je nach vorhandener MySQL-Version sehr wohl machbar.
        Der erste Schritt besteht in der Berechnung des Ranges. Das wurde hier im Forum bereits mehrfach besprochen und ist durch den Einsatz von Benutzervariablen lösbar.

        Wärst du noch so gütig hierfür ebenfalls ein Beispiel zu liefern?

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
    2. Moin!

      Für eine Abfrage eines einzelnen Users (d)ein Ranking zu ermitteln ist nicht machbar.

      Aber klar doch.

      Wenn ich 10 Punkte habe, den wievielten Platz habe ich dann? Dazu muß ich nur zählen, wieviele Leute vor mir sind, und deren Zahl plus 1 ist dann mein Platz.

      Leute, die vor mir sind, sind Leute, die mehr als 10 Punkte haben. Daraus ergibt sich dann relativ simpel die SQL-Abfrage:

      SELECT count(user) FROM tabelle WHERE punkte > '10'

      Das ist in dieser Form allerdings nicht mit anderen Abfragen kombinierbar, die direkt die Userdaten ermitteln, weil gruppiert wird - und das verträgt sich nicht so gut mit direkten Abfragen. Als Subselect wäre es aber denkbar, wobei die Frage ist, ob das nicht unperformanter wird.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. n'abend,

        Wenn ich 10 Punkte habe, den wievielten Platz habe ich dann? Dazu muß ich nur zählen, wieviele Leute vor mir sind, und deren Zahl plus 1 ist dann mein Platz.

        obviously one has the need to see the obvious.

        *notiere* während Statistikvorlesungen nicht im Selfforum rumlungern.

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|