Rangliste in der DB generieren

Apfelkuchen

Mitglied
Hi. Für meinen Tennisklub möchte ich die Website ein bisschen verbessern und für den Betreiber einfacher gestalten. Wir haben so etwas wie eine Tour wo Turniere gespielt werden. Es gibt eine Rangliste.

Ich möchte nun, direkt in MYSQL anhand von der Punkteanzahl die Rangliste erstellen. Der mit den meisten punkten soll Rang 1 haben, der mit der nächst-kleineren Punkteanzahl soll Rang 2 haben usw. Dies soll natürlich geupdated werden sobald sich was ändern.

Mit der Website selbst (HTML, CSS) habe ich keine Probleme. Nur diese MYSQL Sache bremst mich noch.

Könnt ihr mir sagen wie sowas gehen könnte?

Meine Spielertabelle beinhaltet die Felder: vorname, nachname, punkte....

Danke!

Danke
 
Hi,

Ich möchte nun, direkt in MYSQL anhand von der Punkteanzahl die Rangliste erstellen. Der mit den meisten punkten soll Rang 1 haben, der mit der nächst-kleineren Punkteanzahl soll Rang 2 haben usw. Dies soll natürlich geupdated werden sobald sich was ändern.

Warum erstellst Du die Rangliste nicht, indem Du die Datensätze nach Punktzahl sortiert aus der DB holst?

LG
 
Hi,



Warum erstellst Du die Rangliste nicht, indem Du die Datensätze nach Punktzahl sortiert aus der DB holst?

LG

Hi. Naja, für die Ausgabe der Rangliste selber habe ich das so gemacht, dass ich die Daten nach PUnkten sortiert habe und die Platzierung mittels variable $i und $i++ immer erhöht habe. Das funktioniert auch prima mit der Tabelle in der die Daten ausgegeben werden.

PHP:
<link href="css/stylesheet.css" rel="stylesheet" type="text/css">

<?php
  include("dbconnect.php");
  ?>

<?php

$abfrage = "SELECT `id` ,`firstname` , `lastname` , `points`
FROM `player`
ORDER BY `points` DESC";

$ergebnis=mysql_query($abfrage);

?>
<br><br><p align="center" class="headline">Super Tour Rangliste</p><br>
<table width="500" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
    <th align="left"  class="table_label">Platz</th>
    <th align="left"  class="table_label">Vorname</th>
    <th align="left"  class="table_label">Nachname</th>
    <th align="left"  class="table_label">Punkte</th>
</tr>

<?php

$i = 1;

  while($row=mysql_fetch_object($ergebnis)){
    echo '<tr>'."\r\n";

    echo '<td class="text">'.$i++.'</td>'."\r\n";
    echo '<td class="text">'.$row->firstname.'</td>'."\r\n";
    echo '<td class="text">'.$row->lastname.'</td>'."\r\n";
    echo '<td class="text">'.$row->points.'</td>'."\r\n";

    echo '<tr>'."\r\n";
  }

?>
</table>
Was ist aber jetzt wenn ich eine einzelne Spieler Seite mache und dort soll der Rang des Spieler angezeigt werden. Da kann ich dann nicht so pfuschen, sondern der Rang muss ja direkt aus der DB kommen.
 
Zuletzt bearbeitet:
Hi,

Du könntest den Rang in einem Subselect abfragen:

Code:
SELECT s.*, 
   (SELECT COUNT(id) FROM spieler WHERE punkte > s.punkte) as rang
   FROM spieler s
   WHERE s.name = 'Hans-Otto'

LG
 
Hi,

Du könntest den Rang in einem Subselect abfragen:

Code:
SELECT s.*, 
   (SELECT COUNT(id) FROM spieler WHERE punkte > s.punkte) as rang
   FROM spieler s
   WHERE s.name = 'Hans-Otto'
LG


wow das ist toll. Ich habe aber ein bisschen nachgedacht und mir überlegt dass ich eigentlich schon ein feld haben sollte wo ich den rang einfach inder DB habe. Aber da müsste ich sowas wie einen Trigger haben, der dies updatet. Könntest du mir da auch helfen?

Also ein Trigger, der das Feld rang updatet sobald sich was ändert. Dabei schaut es einfach, wieviele reihen, eine höhere punkteanzahl haben als die aktuelle reihe
 
Hi,

wow das ist toll. Ich habe aber ein bisschen nachgedacht und mir überlegt dass ich eigentlich schon ein feld haben sollte wo ich den rang einfach inder DB habe.

Warum? Dafür sollte man gute Gründe haben, denn es handelt sich dann ja um redundante Daten. Die Information ist durch die Punktzahl ja da. Du müsstest sonst ja nach jedem Spiel den Rang der beiden Spieler und die Ränge aller schlechter platzierten Spieler neu berechnen.

LG
 
Hi,



Warum? Dafür sollte man gute Gründe haben, denn es handelt sich dann ja um redundante Daten. Die Information ist durch die Punktzahl ja da. Du müsstest sonst ja nach jedem Spiel den Rang der beiden Spieler und die Ränge aller schlechter platzierten Spieler neu berechnen.

LG


Naja, aber ist es nicht sinnvoller den Rang direkt aus der DB zu holen wenn ich diesen brauche? Sonst muss ich ja immer diese umständige Quary durchführen um den Rang herauszufinden....
 
Hi,

Naja, aber ist es nicht sinnvoller den Rang direkt aus der DB zu holen wenn ich diesen brauche? Sonst muss ich ja immer diese umständige Quary durchführen um den Rang herauszufinden....

Nö. Mit der Abfrage holst Du den Rang ja im Prinzip direkt aus der DB. Ein Trigger, der bei jedem Update eines Datensatzes die halbe Tabelle neu berechnen muss, ist da doch viel umständlicher. Die Abfrage ist auch nicht kompliziert. Was missfällt Dir daran?

LG
 
Hi,



Nö. Mit der Abfrage holst Du den Rang ja im Prinzip direkt aus der DB. Ein Trigger, der bei jedem Update eines Datensatzes die halbe Tabelle neu berechnen muss, ist da doch viel umständlicher. Die Abfrage ist auch nicht kompliziert. Was missfällt Dir daran?

LG

Sie schreckt mich ein bisschen ab, z.b.:

Was ist wenn ich 3-4 Spieler habe, die die gleiche Punkteanzahl haben.

Mark 60, Johann 70, Franz 70, Jack 80

1. Jack
2. Franz
. Johann
3. Mark

Dann möchte ich dass diese Spieler am gleichen Platz sind. Wie kann ich das per PHP lösen?
 
Hi,


ganz auf die Schnelle:
PHP:
<?php

$i = 1;
$rang = 1;
$punkte = 0;

  while($row=mysql_fetch_object($ergebnis)){
    if($i > 1 && $row->points != $punkte) {
       $rang = $i;
    }
    echo '<tr>'."\r\n";
    echo '<td class="text">'.$rang.'</td>'."\r\n";
    echo '<td class="text">'.$row->firstname.'</td>'."\r\n";
    echo '<td class="text">'.$row->lastname.'</td>'."\r\n";
    echo '<td class="text">'.$row->points.'</td>'."\r\n";

    echo '<tr>'."\r\n";
    $punkte = $row->points;
    $i++;
  }

?>

LG
 
Zurück