Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Rangliste bei mehr als zwei gleichen Ergebnissen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Rangliste bei mehr als zwei gleichen Ergebnissen

    Hallo!

    Ich habe eine Tabelle mit den Ergebnissen eines Laufes vorliegen.
    Nun ist es wie üblich so, dass wenn es zB zwei Teilnehmer mit den gleichen Punkten gibt, diese den Platz gemeinsam haben (zB beiden haben den 4. Platz)
    Danach geht es weiter mit dem 6.

    Bis dahin kein Problem!

    Jedoch funktioniert mein Code nicht mehr, sobald mehr als zwei Teilnehmer die gleiche Punkte haben.

    Folgenden Code habe ich bereits aus einem anderen Thema angewandt:

    PHP-Code:
    $i 0//Zählvariable
    $p false//Punkte, die derjenige erreicht hat, der einen Platz weiter oben steht.
    $ergebnis mysql_query("SELECT ... ");
    while(
    $row mysql_fetch_array($ergebnis))
    {
       
    $i++;
       if(
    $p === $row[12]) {
          echo 
    "Platz: ".($i-1);
       } else {
          echo 
    "Platz: ".$i;
       
    $p $row[12];
       }

    Wie gesagt, bei zwei gleichen Punkten ist es kein Problem.

    Sobald es drei eigentlich 20. Plätze gibt, habe ich in der Liste:

    20. ...
    20. ...
    21. ...
    22. ...

    Sprich es werden erstens nur zwei mal hintereinander die Plätze angezeigt und zweitens geht es normal mit der Platzierung weiter, ohne dass die Plätze aufgrund mehrfachen Plätzen übersprungen werden.

    Danke für die Hilfe,
    liebe Grüße
    Philipp


  • #2
    Hinweis:

    Die älteste der drei mysql-Erweiterungen ist veraltet (mysql_*-Funktionen, nicht die MySQL-Datenbank) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
    Choosing an API
    Warum man mysql* generell nicht (mehr) nutzen sollte.
    Wie man von mysql* auf PDO umsteigt
    Wissenswertes zum Thema SQL-Injection

    Und warum sollte das Fortgeschritten sein?
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      mich würde ja brennend das select interessieren, und wieso du dir den rang nicht gleich beim select generierst.
      //update:
      der neuste thread hier im forum ist wieder von so einem "ich sag nicht wie ichs gemacht habe" spezi, erstellt worden, hoilft dir also nur bedingt( der hat auch rote bommel, nicht zu unrecht-wohl).
      ich erinnere mich aber noch an erklärungen des postgresql freundes mit aggergate oder eben nicht; finde das aber nicht, leider. such also selbst.

      Kommentar


      • #4
        Zitat von moma Beitrag anzeigen
        mich würde ja brennend das select interessieren, und wieso du dir den rang nicht gleich beim select generierst.

        ich erinnere mich aber noch an erklärungen des postgresql freundes mit aggergate oder eben nicht; finde das aber nicht, leider. such also selbst.
        Das hier hat nichts mit Aggregation und Gruppierung zu tun, sondern mit einer ganz einfachen RANK() oder DENSE_RANK() - Funktion:

        Code:
        test=*# select * from lauf;
         teilnehmer | zeit
        ------------+------
                  1 |   12
                  2 |   11
                  3 |   13
                  4 |   12
                  5 |   11
        (5 rows)
        
        Time: 0,195 ms
        test=*# select *, rank() over (order by zeit desc), dense_rank() over (order by zeit desc) from lauf;
         teilnehmer | zeit | rank | dense_rank
        ------------+------+------+------------
                  3 |   13 |    1 |          1
                  1 |   12 |    2 |          2
                  4 |   12 |    2 |          2
                  2 |   11 |    4 |          3
                  5 |   11 |    4 |          3
        (5 rows)
        Bei rank() gibt es halt (bei diesen Zahlen) keinen Dritten. Dense_rank() läßt dafür keine Lücken. Je nachdem, was man braucht, entscheidet man sich für eine der beiden Funktionen.

        MySQL kann das aber, wie vieles, NICHT.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          also nicht, rank und dense rank ging nur mit ner db, ich erinnere mich.
          http://www.php.de/709490-post23.html
          TE: was ist hier erledigt?

          Kommentar


          • #6
            Hier ein möglicher 'Workaround' für MySQL. (Zugegeben, ist vermutlich langsamer und verhält sich anders, sollte aber auch zum Ziel führen)

            http://dba.stackexchange.com/a/41483

            @TE: Schau dir auch die anderen Antworten an. Google 'mysql ranking' sollte dich zu anderen Lösungsmöglichkeiten führen.
            Zitat von nikosch
            Naja, anscheinend spricht die Steckdose kein HTTP. LOL

            Kommentar


            • #7
              Themenmoderation:
              [→] Verschoben von PHP-Fortgeschrittene
              Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

              Kommentar

              Lädt...
              X