Ankündigung

Einklappen
Keine Ankündigung bisher.

Rangliste

Einklappen

Neue Werbung 2019

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

  • Rangliste

    Hallo Gemeinde,

    Ich möchte gerne eine Rangliste für Sportschützen erstellen. Meine Sortierung ist auch soweit in Ordnung. Mein Problem: Wenn es mehrere Schützen mit der gleicher Punktzahl gibt. 1.Sortierung Punkte -> dann 3.Serie -> dann 2.Serie -> dann 1.Serie. Erst wenn alle Kriterien gleich sind sollen die Schützen die gleiche Platzierung erhalten. Beispiel:

    Platz | Name | 1.Serie | 2.Serie | 3.Serie | Gesamt
    1 Schütze 1 90 90 90 270
    2 Schütze 2 90 91 89 270
    2 Schütze 3 90 91 89 270
    4 Schütze 4 80 80 100 260

    Kann mir da einer bei helfen?

    PHP-Code:
    echo "<table border=1><tr>";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Platz";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Ringzahl Gesamt";  
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Serie 1";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Serie 2";
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Serie 3";
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>Name";    
        
    echo 
    "</td></tr></table>";


     
    $i=1

    $sql mysql_query("select Serie_1, Serie_2, Serie_3, Punkte, Name from stadtmeisterschaft order by Punkte DESC , Serie_3 DESC, Serie_2 DESC, Serie_1 DESC");    
    while (
    $ds mysql_fetch_object($sql)){    

    $Punkte $ds -> Punkte;    
    $Name $ds -> Name;    
    $Serie_1 $ds-> Serie_1;
    $Serie_2 $ds-> Serie_2;
    $Serie_3 $ds-> Serie_3;
    echo 
    "<table border=1><tr>";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$i";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$Punkte";  
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$Serie_1";    
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$Serie_2";
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$Serie_3";
    echo 
    "<td width=100 align=left valign=top bgcolor=#C0C0C0 rowspan=5><P align=center>$Name";    
        
    echo 
    "</td></tr></table>";    

    $i++;


  • #2
    Zitat von summi Beitrag anzeigen
    Hallo Gemeinde,

    Ich möchte gerne eine Rangliste für Sportschützen erstellen. Meine Sortierung ist auch soweit in Ordnung. Mein Problem: Wenn es mehrere Schützen mit der gleicher Punktzahl gibt. 1.Sortierung Punkte -> dann 3.Serie -> dann 2.Serie -> dann 1.Serie. Erst wenn alle Kriterien gleich sind sollen die Schützen die gleiche Platzierung erhalten. Beispiel:

    Platz | Name | 1.Serie | 2.Serie | 3.Serie | Gesamt
    1 Schütze 1 90 90 90 270
    2 Schütze 2 90 91 89 270
    2 Schütze 3 90 91 89 270
    4 Schütze 4 80 80 100 260

    Kann mir da einer bei helfen?

    Die Gesamtspalte in der DB ist hyperfluid, also überflüssig. Du suchst als den Rank:

    Code:
    test=*# select * from summi ;
     schuetze | s1 | s2 | s3
    ----------+----+----+-----
            1 | 90 | 90 |  90
            2 | 90 | 91 |  89
            3 | 90 | 91 |  89
            4 | 80 | 80 | 100
    (4 rows)
    
    Time: 0,152 ms
    test=*# select *, s1+s2+s3 as gesamt, rank() over (order by s1+s2+s3 desc, s3,s2,s1) from summi ;
     schuetze | s1 | s2 | s3  | gesamt | rank
    ----------+----+----+-----+--------+------
            2 | 90 | 91 |  89 |    270 |    1
            3 | 90 | 91 |  89 |    270 |    1
            1 | 90 | 90 |  90 |    270 |    3
            4 | 80 | 80 | 100 |    260 |    4
    (4 rows)
    Andreas
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zu aller erst solltest du mal aufhören, mysql_* zu nutzen. Es ist aktuell veraltet und wird in der kommenden PHP-Version entfernt. Es wäre deutlich besser, PDO (http://php.net/manual/de/book.pdo.php) zu nutzen.

      Als nächstes wäre es gut für die Lesbarkeit deines Codes, dich an einen Coding-Standard zu halten (http://www.php-fig.org/)

      Also meine SQL-Kenntnisse sind absolut nicht die besten hier im Forum, aber soweit ich weis, ist das, was akretschmer dort macht, ein PgSQL Feature (ich rede von der Funktion over()) und damit nicht in MySQL vertreten.

      LG
      https://github.com/Ma27
      Javascript Logic is funny:
      [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

      Kommentar


      • #4
        Zitat von Ma27 Beitrag anzeigen
        Also meine SQL-Kenntnisse sind absolut nicht die besten hier im Forum, aber soweit ich weis, ist das, was akretschmer dort macht, ein PgSQL Feature (ich rede von der Funktion over()) und damit nicht in MySQL vertreten.

        LG
        Nein, kein PgSQL-Feature, sondern ein normales SQL-Feature, was mittlerweile fast alle Datenbanken können. MySQL ist eine Ausnahme.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Aber für viele "fehlenden" Möglichkeiten gibt es Workarounds, wie z.B. dieses hier: http://stackoverflow.com/questions/3...-rank-function
          Ob Dir das weiterhilft, weiß ich allerdings nicht...
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            der kreigt gleiche plätze (punktegleichstand) nicht hin, afaik;
            der hier überspringt dafür die folgenden nicht (1,1,2 statt richtig 1,1,3):
            http://www.sqlfiddle.com/#!2/d5587/1

            egal, kann man sicher hinkriegen.

            Kommentar


            • #7
              Hier ist auch noch ein Fiddle verlinkt, der evtl. weiterhilft:
              http://stackoverflow.com/questions/1...rder-by-clause
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Zitat von moma Beitrag anzeigen
                der kreigt gleiche plätze (punktegleichstand) nicht hin, afaik;
                der hier überspringt dafür die folgenden nicht (1,1,2 statt richtig 1,1,3):
                Ja, das ist dense_rank(), nicht rank().

                Code:
                test=*# select *, s1+s2+s3 as gesamt, rank() over (order by s1+s2+s3 desc, s3,s2,s1) from summi ;
                 schuetze | s1 | s2 | s3  | gesamt | rank
                ----------+----+----+-----+--------+------
                        2 | 90 | 91 |  89 |    270 |    1
                        3 | 90 | 91 |  89 |    270 |    1
                        1 | 90 | 90 |  90 |    270 |    3
                        4 | 80 | 80 | 100 |    260 |    4
                (4 rows)
                
                Time: 0,323 ms
                test=*# select *, s1+s2+s3 as gesamt, dense_rank() over (order by s1+s2+s3 desc, s3,s2,s1) from summi ;
                 schuetze | s1 | s2 | s3  | gesamt | dense_rank
                ----------+----+----+-----+--------+------------
                        2 | 90 | 91 |  89 |    270 |          1
                        3 | 90 | 91 |  89 |    270 |          1
                        1 | 90 | 90 |  90 |    270 |          2
                        4 | 80 | 80 | 100 |    260 |          3
                (4 rows)
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von akretschmer Beitrag anzeigen
                  Ja, das ist dense_rank(), nicht rank().
                  was bin ich froh dass man bei mysql all solche feinheiten nicht wissen muss
                  wenn man allerdings postgresql hat, kann man hier jede frage nach dem motto (ich hab mysql und folgendes problem)b stellen, und bekommt von dir sofort eine qualifizierte lösung.
                  das spart arbeit.

                  so hat alles seine vor und nachteile.

                  Kommentar


                  • #10
                    Jetzt verstehe ich nur noch Bahnhof. Ich bin blutiger Anfänger.
                    Die Tabelle von "akretschmer" wird allerdigs falsch soertiert.

                    1.Sortierung Punkte (wenn Gleichheit)
                    -> dann 3.Serie -> dann 2.Serie -> dann 1.Serie.

                    Kommentar


                    • #11
                      Na das lässt sich ja anpassen, aber solange Du MySQL verwendest, kommste da eh nicht viel weiter mit, nehme ich an...

                      EDIT:
                      Wer auch immer das hier neutral mit "Gibt ja auch noch PHP" bewertet hat: Ja gibt es, ändert aber nichts an den Kernaussagen in diesem Thread!
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Zitat von summi Beitrag anzeigen
                        Jetzt verstehe ich nur noch Bahnhof. Ich bin blutiger Anfänger.
                        Die Tabelle von "akretschmer" wird allerdigs falsch soertiert.

                        1.Sortierung Punkte (wenn Gleichheit)
                        -> dann 3.Serie -> dann 2.Serie -> dann 1.Serie.
                        Sorry, desc vergessen:

                        Code:
                        test=*# select *, s1+s2+s3 as gesamt, rank() over (order by s1+s2+s3 desc, s3 desc,s2 desc,s1 desc) from summi ;
                         schuetze | s1 | s2 | s3  | gesamt | rank
                        ----------+----+----+-----+--------+------
                                1 | 90 | 90 |  90 |    270 |    1
                                2 | 90 | 91 |  89 |    270 |    2
                                3 | 90 | 91 |  89 |    270 |    2
                                4 | 80 | 80 | 100 |    260 |    4
                        (4 rows)
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Zitat von summi Beitrag anzeigen
                          Jetzt verstehe ich nur noch Bahnhof. Ich bin blutiger Anfänger.
                          Btw.: ich verwende eine funktionierende DB, PostgreSQL, die viele Features des SQL-Standards realisiert. Du hast MySQL. Aber als Anfänger kannst ja die Entscheidung noch mal ändern, oder?
                          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                          Kommentar


                          • #14
                            Wenn man nach Lösungen für PostgreSQL suchen würde, hätte ich danach gefragt. Ich habe aber MySql und kann mit den Vorschlägen nichts anfangen.

                            Kommentar


                            • #15
                              Zitat von summi Beitrag anzeigen
                              Wenn man nach Lösungen für PostgreSQL suchen würde, hätte ich danach gefragt. Ich habe aber MySql und kann mit den Vorschlägen nichts anfangen.
                              Nun ja, Dir bleibt immer noch, nach 'mysql rank' zu googeln. Etwas Eigeninitiative darf schon sein, und ein Blick übern Tellerrand hat noch nie geschadet. Viel Spaß noch mit MySQL!
                              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                              Kommentar

                              Lädt...
                              X