kostenloser Webspace werbefrei: lima-city


Doppelte Platzbelegung bei Highscore erkennen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    aff3m1tw4ff3

    aff3m1tw4ff3 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    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
  4. 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--).
  5. 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 überspringen
    SET @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 überspringen
    SET @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
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!