Liga - Alltime Tabelle erstellen

Schneeflocke

Grünschnabel
Hallo :)

Ich habe eine Frage zu meinem Ligasystem.

Ich möchte nun eine Statistik einbauen wo man eine Alltime Tabelle anschauen kann.
Nun möchte ich nicht nach jeder abgeschlossenen Saison die Seiten für alle Ligen Manuell updaten und erweitern, sondern es per PHP automatisch machen lassen.

Wie kann man das am besten machen ? Manuell einen komplexen Code schreiben, oder gibt es einen einfachen MYSQL Befehl der dies machen kann ?


Hier erstmal der Aufbau meiner MYSQL Tabelle :

  1. Platz
  2. Saison
  3. Liga
  4. Name
  5. Spiele
  6. Sieg
  7. Remis
  8. Niederlage
  9. Tore+
  10. Tore-
  11. Differenz
  12. Punkte

Ich habe zur Zeit 5 Ligen mit jeweils 10 Spielern und es sind jetzt schon einige Saison abgeschlossen. Also schon einiges an Daten zusammengekommen und einige Spieler haben natürlich schon die Ligen durch Auf- und Abstiege gewechselt.

Wie bekomme ich es nun möglichst einfach hin, das eine Alltime Tabelle erstellt wird.

Beispiel :

Spieler 1, Saison 1, Liga 1, 8 Siege, 1 Remis, 1 Niederlage, 9:1 Tore, 17 Punkte
Spieler 1, Saison 2, Liga 1, 1 Sieg, 0 Remis, 9 Niederlagen, 1:15 Tore, 2 Punkte
Spieler 1, Saison 3, Liga 2, 10 Siege, 0 Remis, 0 Niederlagen, 20:0 Tore, 20 Punkte
Spieler 1, Saison 4, Liga 1, 5 Siege, 2 Remis, 3 Niederlagen, 14:5 Tore, 12 Punkte
Spieler 2, Saison 4, Liga 2, 8 Siege, 0 Remis, 2 Niederlagen, 17:8 Tore, 16 Punkte

Wenn ich nun die Alltime Tabelle für Liga 1 anschauen möchte sollte folgendes rauskommen :

Spieler 1, 14 Siege, 3 Remis, 13 Niederlagen, 24:21 Tore, 31 Punkte

Für Liga 2 sollte das rauskommen :

Spieler 1, 10 Siege, 0 Remis, 0 Niederlagen, 20:0 Tore, 20 Punkte
Spieler 2, 8 Siege, 0 Remis, 2 Niederlagen, 17:8 Tore, 16 Punkte


Jeder Spieler der also auch nur 1 Spiel in der ausgewählten Liga gemacht hat sollte aufgeführt werden und dann halt alles zusammengezählt werden. Zum Abschluss sollte dann diese neuerstellte Tabelle noch geordnet werden nach verschiedenen Kategorien wie z. B. ORDER BY Punkte DESC, Differenz DESC, Tore+ DESC .....


Also geht sowas komplett mit MYSQL, oder selbst schreiben mit vielen Schleifen usw. ?

Wäre Dankbar für ein paar Tips und Tricks. ;)
 
Hallo!

Wozu denn Schleifen?
Das sollte in einer einzigen MySQL-Query möglich sein.
Beispiel:
In diesem Beispiel gehe ich davon aus, dass du nur EINE MySQL-Tabelle hast, in der sämtliche Sasions, Ligen usw. gespeichert sind (so hab' ich das deinem Post entnommen).
Es soll hier zu einer bestimmten Liga eine Rangliste von Spielern erstellt werden:

PHP:
<html><head><title>Alltime-Rangliste</title></head><body><h3>Alltime-Rangliste für Liga 1</h3><p />
<table border=1>
    <tr>
        <td>Platz</td>
        <td>Spieler</td>
        <td>Siege</td>
        <td>Remis</td>
        <td>Niederlagen</td>
        <td>Tore</td>
        <td>Differenz</td>
        <td>Punkte</td>
   </tr>
<?php
mysql_connect ($host, $user, $pw);
mysql_select_db ('datenbank');

$ligen      = array (1);  // Name der Liga, für die die Rangliste erstellt werden soll (Leeres Array = alle)
$spieler = array ();               //  Name der Spieler, die berücksichtigt werden sollen (Leeres Array = alle)

$query = 'SELECT
                  spieler,
                  SUM( siege )      AS siege,
                  SUM( remis )      AS remis,
                  SUM( niederlagen) AS niederlagen,
                  SUM( toreplus )   AS toreplus,
                  SUM( toreminus )  AS toreminus,
                  SUM( toreplus ) - SUM( toreminus ) AS differenz,
                  SUM( punkte )     AS punkte
              FROM tabelle_der_ligen WHERE';

for ( $i = 0; $i < sizeof ($ligen); $i++ )
{
    if ( $i == 0 )
        $query .= ' liga IN (';

    $query .= '' . $ligen[$i] . '';

    $query .= $i == sizeof ($ligen) -1 ? ')' : ',';
}

for ( $i = 0; $i < sizeof ($spieler); $i++ )
{
    if ( $i == 0 )
    {
        if ( sizeof ($ligen) > 0 )
            $query .= ' AND';

        $query .= ' spieler IN (';
    }

    $query .= '\'' . $spieler[$i] . '\'';

    $query .= $i == sizeof ($spieler) -1 ? ')' : ',';
}

    $query .= ' GROUP BY liga,spieler '; // Die gesamten Ligen und Spieler zusammenfassen
    $query .= ' ORDER BY liga ASC,punkte DESC,differenz DESC';

    $r = mysql_query ($query) OR die (mysql_error());

    if (mysql_num_rows($r) < 1)
      die ($query);
    $nummer = 1;

    while ( $a = mysql_fetch_assoc ($r) )
    {
        echo "<tr>
          <td>$nummer</td>
          <td>$a[spieler]</td>
          <td>$a[siege]</td>
          <td>$a[remis]</td>
          <td>$a[niederlagen]</td>
          <td>$a[toreplus]:$a[toreminus]</td>
          <td>$a[differenz]</td>
          <td>$a[punkte]</td></tr>";

        $nummer++;
    }
?>
</table></body></html>

OK, zugegeben. Das Script enthält auch zwei Schleifen, die dienen aber nur dazu die Query so aufzubauen, dass du nach verschiedenen Spielern und/oder Ligen filtern kannst. Wenn du das garnicht brauchst, reicht ja auch eine WHERE-Bedingung, die nur eine Liga filtert.

Sicherlich kann man das Script-Beispiel effizienter usw. gestalten, ich möchte allerdings nur die Funktionalität beschreiben und nicht das fertige Script posten. ;)

Das Wichtigste in diesem Script ist die MySQL-Funktion SUM () und das Schlüsselwort GROUP BY (für die Besserwisser - es sind natürlich zwei Wörter ;) ).
Damit werden die Punkte, die Tore und die Tor-Differenzen ausgerechnet und anschliessend alle Datensätze der jeweiligen Liga bzw. Spieler zusammen gefasst.

Wie du dir wohl schon denken kannst, kann man nicht einfach alle Plätze der Spieler zusammen Rechnen, um heraus zu finden, wer denn nun am Ende auf Platz 1 ist (Dann wären ja bei 5 gespielten Saisons ein Spieler, der immer nur auf Platz 1 war in der Gesamtwertung auf Platz 5).
Deshalb hab' ich das auch in die Ausgaben-Schleife gepackt (ich rate dir sowieso davon ab, den Platz und die Tordifferenz in der Tabelle zu speichern - die sollte eher ausgerechnet werden).

Ich hab' das Script eben noch getestet und es hat auf den ersten Blick funktioniert.
Das Ergebnis sieht so aus (die Zahlen sollen dabei nicht unbedings real sein... ;) ):
 

Anhänge

  • liga.png
    liga.png
    2,5 KB · Aufrufe: 78
Zuletzt bearbeitet:
Hallo :)

Vielen Dank für die mehr als reichliche Antwort.
So ausführlich wäre es garnicht nötig gewesen. ;)

Ich bin ja kein blutiger Anfänger mehr. Sehe mich als Fortgeschrittenen User an.
Ich habe ja schon ein schönes Ligasystem aufgebaut mit Loginsystem wo sich die User anmelden können und dort ihre Ergebnisse posten. Gleich danach wird das Ergebnis automatisch eingetragen und die Tabelle wird neu ausgerechnet.

In diesem Beispiel gehe ich davon aus, dass du nur EINE MySQL-Tabelle hast, in der sämtliche Sasions, Ligen usw. gespeichert sind (so hab' ich das deinem Post entnommen).

So ist es. Eine Tabelle für alle Ligen und alle Saisons. So kann man ganz einfach die Tabellen auslesen.

(ich rate dir sowieso davon ab, den Platz und die Tordifferenz in der Tabelle zu speichern - die sollte eher ausgerechnet werden)

Dies habe ich zwar in der Tabelle drinne, wird aber nach jeder Ergebnismeldung neu berechnet und ersetzt. So kann man beim betrachten der Tabelle ganz schnell ohne Berechnung diese anzeigen lassen.

Das Wichtigste in diesem Script ist die MySQL-Funktion SUM () und das Schlüsselwort GROUP BY (für die Besserwisser - es sind natürlich zwei Wörter ).

Diese Funktionen habe ich bisher nie benutzt und kannte sie nicht. Deshalb bin ich nun froh das es sowas gibt und man es mit MYSQL so einfach machen kann.


Vielen Dank nochmal. :)
Werde das ganze am Sonntag mal ausprobieren.
 
Zurück