#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 :/ + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren