Doppelte Platzbelegung bei Highscore erkennen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktuellen platz
aktueller code
beleg
code
datum
durchlauf
gleiche punktzahl
kreisen
limit
machen
menge
null
ordern
platz
plazierung
preis
rufen
schleife
set
url
-
Hallo,
ich rufe für eine Highscore die ersten 10 Datensätze aus der DB auf, diese sortiere ich dann nach einer Spalte, eine Highscore eben.
Nun kommt es sehr oft vor das Plätze doppelt belegt sind, da sie eben die gleiche Punktzahl haben.
Das würde ich gern beim ausführen erkennen und dann meinen Zähler nicht nach oben Zählen, also den Platz nicht hochzählen.
Gibt es eine Möglichkeit das direkt beim Select zu machen? Mit PHP drehe ich mich da irgendwie im Kreis und ich vermute mal das es da nen einfacheren Weg gibt.
Mein aktueller Code dazu sieht so aus:
$i=0; // Highscorre erstellen $h_scorre_top10ko = $mysqli->query("SELECT * FROM `event_wuerfeln` ORDER by ko DESC LIMIT 0,10"); while($daten = $h_scorre_top10ko->fetch_object() ){ $name_scorre = $daten->name;// Name des Users $ko = $daten->ko;// Menge Ko des Users $i++;// Aktuellen Platz hochzählen $platz = $i;// Platz belegen für 0 voran, i muss weiter laufen $platz = sprintf ("%02d",$platz);// 0 voran if ($i == 1){$preis = "<img src=\"../icon/hase_beleidigt.png\" title=\"Bunny KO\" width=\"30px\" height=\"35px\" />";} elseif ($i == 2){$preis = "10 x BBB";} elseif ($i == 3 || $i == 6){$preis = "<img src=\"../icon/icon_wuerfel_einzeln.png\" title=\"Ein Würfel für die Würfelpyramide\" />";} elseif ($i == 4 || $i == 8){$preis = "6 x BBB";} else{}
Ich weiß leider nicht mal wonach ich Googeln soll....
LG Marco -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das Feature nennt sich RANK und ist eher für Fortgeschrittene. In MySQL muss man es aber nachbauen, hier sind ein paar Ideen dazu:
http://stackoverflow.com/questions/3333665/rank-function-in-mysql
Da ist eine Lösung über PHP sicher einfacher: Du brauchst vor dem Erhöhen des Platzes nur eine Bedingung, ob der aktuelle Score ungleich dem Vorgänger-Score ist.
Beitrag zuletzt geändert: 27.8.2015 19:53:44 von cbhp -
Da war jemand schneller, also die PHP-Variante.
Ansonsten könntest du vor der while Schleife $ko=0 und in der Schleife dann $ko den tatsächlichen Wert übergeben. Den kannst du dann ja vergleichen. ist er gleich dann musst du $i eben wieder runter zählen ($i--). -
hallo affemitwaffe,
es wäre noch zu überlegen ob mehrfach belegte platzierungen dafür sorgen sollen das die nachfolgeplatzierungen übersprungen werden - also so:
platz_____ko
1_______104
2_______82
2_______82
4_______74
5_______68
oder:
platz_____ko
1_______104
2_______82
2_______82
3_______74
4_______ 68
ich denke ersteres macht mehr sinn, dazu das script:
<?php $i_durchlauf = 0; $i_platzierung = 0; $i_ko_vorher = false; $h_scorre_top10ko = $mysqli->query("SELECT * FROM `event_wuerfeln` ORDER by ko DESC LIMIT 0,10"); while($a_daten=$h_scorre_top10ko->fetch_object()) { $i_durchlauf++; $c_name_scorre = $a_daten->name; $i_ko = (int)$a_daten->ko; if($i_ko!=$i_ko_vorher) { $i_platzierung = $i_durchlauf; } $i_ko_vorher = $i_ko; if($i_platzierung==1) { $c_preis = '<img src="../icon/hase_beleidigt.png" title="Bunny KO" width="30px" height="35px" />'; }elseif($i_platzierung==2) { $c_preis = '10 x BBB'; }elseif($i_platzierung==3 || $i_platzierung==6) { $c_preis = '<img src="../icon/icon_wuerfel_einzeln.png" title="Ein Würfel für die Würfelpyramide" />'; }elseif($i_platzierung==4 || $i_platzierung==8) { $c_preis = '6 x BBB'; } $c_platzierung = sprintf("%02d",$i_platzierung); /* ... */ } ?>
(davon ausgehend das ko als ganze zahl abgelegt ist)
und hier nochmal eine möglichkeit in mysql aus cbhp's link:
variante 1: mit überspringenSET @ko_vorher = NULL; SET @platzierung_zaehler = 0; SET @durchlauf = 0; SELECT *, @durchlauf := @durchlauf+1 AS durchlauf_zaehler, CASE WHEN @ko_vorher = ko THEN @platzierung_zaehler WHEN @ko_vorher := ko THEN @platzierung_zaehler := @durchlauf END AS platzierung FROM event_wuerfeln ORDER BY ko DESC LIMIT 0 , 10
variante 2: ohne überspringenSET @ko_vorher = NULL; SET @platzierung_zaehler = 0; SELECT *, CASE WHEN @ko_vorher = ko THEN @platzierung_zaehler WHEN @ko_vorher := ko THEN @platzierung_zaehler := @platzierung_zaehler +1 END AS platzierung FROM event_wuerfeln ORDER BY ko DESC LIMIT 0 , 10
LG hechma
Beitrag zuletzt geändert: 30.8.2015 17:42:11 von hechma -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage