[SQL] Platzierung ermitteln

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Fuselmeister, 22. September 2010 .

Schlagworte:
  1. 22. September 2010
    Platzierung ermitteln

    Hi ich will die Platzierung einer Person bei einer Meisterschaft ermitteln. Die Tabelle sieht ungefähr so aus:
    [nfo]
    Name | Wettkampf1 | Wettkampf 2 | Wettkampf 3 | Wettkampf 4
    ================================================================
    Hans | 1 | 2 | 0 | 5
    Dieter | 3 | 4 | 1 | 2
    Detlef | 0 | 1 | 2 | 5
    [/nfo]

    Momentan manche ich das noch mit der Abfrage
    Code:
    SELECT Name,(Wettkampf1+Wettkampf2+Wettkampf3+Wettkampf4) as Gesamtpunkte FROM meisterschaft ORDER BY (Wettkampf1+Wettkampf2+Wettkampf3+Wettkampf4) DESC
    dann gehe ich mit ner Schleife die Abfrage durch und zähle die Plätze hoch bis ich die Person erreicht habe. Wichtig: Wenn zwei Leute gleich viele Punkte haben, stehen sie auch auf den gleichen Platz!

    Das funktioniert ganz gut, nur hab ich das gefühlt, dass diese Lösung nicht elegant und nich gerade performant ist. Gibts da ne bessere Möglichkeit? Evtl. auch SQL Befehle/Functionen die sich eigenen? Ich hab in der Dokumentation jetzt nichts gefunden.

    MySQL Version ist die 5.0.51

    mfg
    Fuselmeister
     
  2. 22. September 2010
    AW: Platzierung ermitteln

    Code:
    SELECT Name,(Wettkampf1+Wettkampf2+Wettkampf3+Wettkampf4) as Gesamtpunkte FROM meisterschaft GROUP BY `Gesamtpunkte` ORDER BY `Gesamtpunkte` DESC LIMIT 1,5
    Wenn ich mich nicht Total Irre sollte das Den Platz 5 Ausgeben. Ohne Schleife.
     
  3. 22. September 2010
    AW: Platzierung ermitteln

    Code:
    SET @platz_nummer = 0;
    
    SELECT 
     `Name`, 
     ( @platz_nummer := @platz_nummer + 1 ) `Platzierung`,
     ( Wettkampf1 + Wettkampf2 + Wettkampf3 + Wettkampf4 ) `Gesamtpunkte`
    FROM `meisterschaft` 
    ORDER BY `Gesamtpunkte` DESC
    das nummeriert dir "Platznummer" von 1 - n durch ohne ausnahme.

    auf nen bestimmten platz kannst du mit folgendem ausdruck zugreifen:
    Code:
    HAVING `Platzierung` = __NUMMER__
    also komplett so:
    Code:
    SET @platz_nummer = 0;
    
    SELECT 
     `Name`, 
     ( @platz_nummer := @platz_nummer + 1 ) `Platzierung`,
     ( Wettkampf1 + Wettkampf2 + Wettkampf3 + Wettkampf4 ) `Gesamtpunkte`
    FROM `meisterschaft` 
    HAVING `Platzierung` = 3
    ORDER BY `Gesamtpunkte` DESC
    ermittelt dir den spieler an platz 3

    ----

    als php-code:
    PHP:
    <? php

    mysql_query
    ( 'SET @platz_nummer = 0;' );

    $query  mysql_query ( '
        SELECT 
            `Name`, 
            ( @platz_nummer := @platz_nummer + 1 ) `Platzierung`,
            ( Wettkampf1 + Wettkampf2 + Wettkampf3 + Wettkampf4 ) `Gesamtpunkte`
        FROM `meisterschaft` 
        ORDER BY `Gesamtpunkte` DESC
    '
    );

    // weitermachen
     
  4. 22. September 2010
    AW: Platzierung ermitteln

    thx murdoc ich hab deinen ansatz mal so weiterentwickelt, dass der den rang nur weiter hochzählt, wenn die Gesamtpunkte kleiner sind als vorher
    Code:
    SET @platz_nummer = 1;
    SET @last = 0;
    SELECT
     `Name`,
    (`Wettkampf1`,`Wettkampf2`,`Wettkampf3`,`Wettkampf4`) as `Gesamt`,
    (
     IF(@last>(`Wettkampf1`,`Wettkampf2`,`Wettkampf3`,`Wettkampf4`),@platz_nummer := @platz_nummer +1,@platz_nummer)
    ) as `Rang`,
    (@last := (`Wettkampf1`,`Wettkampf2`,`Wettkampf3`,`Wettkampf4`)) as Last
    FROM meisterschaft
    ORDER BY Gesamt DESC
    
    ich hab jetzt einfach eine Hilfsspalte eingefügt, wusste mir jetzt nicht anders zu helfen^^

    Aber wenn ich jetzt nich die ganze Tabelle haben will oder wissen will wer auf platz 5 ist, wie mach ich dass den dann?
    Ich hab mal nen WHERE klausel reingenommen mit `Name`= 'Hans' aber dann hat der als Rang bei dem 1 ausgegeben und nicht den wirklichen Platz :/
     
  5. 22. September 2010
    AW: Platzierung ermitteln

    das funktioniert so nicht.

    versuch es mal so:
    Code:
    SET @rank_number = 1, @last_points = 0, @points = 0;
    
    SELECT
     `Name`,
     ( @points := ( `Wettkampf1` + `Wettkampf2` + `Wettkampf3` + `Wettkampf4` ) ) `Gesamt`,
     ( @rank_number := @rank_number + IF(@last_points > @points, 1, 0) ) `Rang`,
     ( @last_points := @points )
    FROM `meisterschaft`
    ORDER BY `Gesamt` DESC
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.