Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Platzierung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mr.mc.mauser, 18 November 2015.

  1. mr.mc.mauser

    mr.mc.mauser Neuer Benutzer

    Hallo,

    ich habe ein kleines programm für Bogenturniere geschrieben.
    Für die Siegerehrung benötigt man wie in jedem anderen Sport auch eine Platzierung.
    Schützen mit 0 Punkten werden nicht gewertet.
    Folgendes habe ich mit MYSQL umgesetzt:

    SET @p = 0;
    SELECT
    *,
    (`pkt1`+`pkt2`) as pkt_ges,
    (`spot1`+`spot2`) as spot_ges,
    IF((`pkt1`+`pkt2`) = 0, '', (@p := @p + 1) ) as `Platz`
    FROM `schuetzen` where `bez`= 1
    ORDER BY
    pkt_ges DESC, kill_ges DESC


    Damit bekommt man schön die plätze ausgegeben. Nur bei Punkt + Spot Gleichstand kommt Murks raus.
    platz 1 = Fritz mit 10pkt, 5 Spot
    platz 2 = Franz mit 10pkt, 4 Spot
    platz 3 = Emil mit 10pkt, 4 Spot

    platz 4 = Hugo mit 9pkt, 2 Spot

    Jetzt hätte ich es auch gerne das wenn Punkt und Spot gleichstand gibt das es dann z.b. so aussieht

    platz 1 = Fritz mit 10pkt, 5 Spot
    platz 2 = Franz mit 10pkt, 4 Spot
    platz 2 = Emil mit 10pkt, 4 Spot

    platz 4 = Hugo mit 9pkt, 2 Spot
    usw...

    In der Verarbeitung der Daten in meinem Programm ist es kein problem.
    Ich suche nach einer Reinen SQL Lösung.
    Über sinn und Unsinn lässt sich streiten, es ist reines Interesse.

    Gruß
    Robert
     
  2. ukulele

    ukulele Datenbank-Guru

    In SQL kann man das sehr elegant mit rank() lösen, leider gibt es das in MySQL nicht. Hier der Workaround:
    Rank function in MySQL
     
  3. akretschmer

    akretschmer Datenbank-Guru

    rank() und dense_rank(), aber wie schon gesagt nicht in MySQL.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    nur um es mal kurz zu zeigen

    Code:
    test=*# select * from punkte ;
     name | punkte
    ------+--------
     max  |  10
     lisa |  8
     elli |  8
     paul |  6
    (4 rows)
    
    test=*# select *, rank() over (partition by 1 order by punkte desc), dense_rank() over (partition by 1 order by punkte desc) from punkte ;
     name | punkte | rank | dense_rank
    ------+--------+------+------------
     max  |  10 |  1 |  1
     lisa |  8 |  2 |  2
     elli |  8 |  2 |  2
     paul |  6 |  4 |  3
    (4 rows)
    
     
  5. mr.mc.mauser

    mr.mc.mauser Neuer Benutzer

    Danke rank() war das Stichwort.....
    Hab den Link von ukulele man Rank in MYSQL umsetzen kann.

    Das kam dabei raus, und es Funktioniert...
    Code:
    SELECT *,
         (`pkt1`+`pkt2`) as pkt_ges,
         (`kill1`+`kill2`) as kill_ges,
         IF(
           (`pkt1`+`pkt2`) = 0, '',
           IF(
             (
               (pkt1+pkt2)*1000+kill2+kill1)= @_lastplatz,
               @curRank:=@curRank,
               @curRank:=@_sequence
             )
         ) AS platz,
         @_sequence:=@_sequence+1,
         @_lastplatz:=((pkt1+pkt2)*1000+kill2+kill1)
    FROM
       schuetzen,
       (
         SELECT @curRank := 1,
         @_sequence:=1,
         @_lastplatz:=0
       ) r
    ORDER BY
       pkt_ges DESC,
       kill_ges DESC
    
    Ohne das * 1000 klappt es nicht
    Gruß
    Robert
     
    Walter gefällt das.

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden