Thomas: SQL-Abfrage oder -Skript für Ermittlung längste Siegesserie

Hallo,

Unter www.box-manager.com habe ich ein textbasiertes Internetspiel zum Thema Boxsport geschrieben.

Nun würde ich gern eine Statistik in das Spiel einbauen, welche Boxer die längsten Siegesserien hatten.

Die Kämpfe habe ich in einer Datenbanktabelle mit der folgenden Grobstruktur gespeichert:
id datum boxer1id boxer2id siegerid

Nun möchte ich sortiert nach den längsten Siegesserien ermittelt, welche Boxer die meisten Kämpfe in Folge gewonnen haben.

Kennt jemand für so etwas ein geeignetes SQL-Skript?
Ich denke für eine einzige SQL-Abfrage ist es zu komplex, da ich ja im Endeffekt pro Boxer ermitteln muss, wie viele Kämpfe IN FOLGE ohne Unterbrechnung durch Niederlagen gewonnen wurden, und das Ganze muss ich dann sobald ich das für jeden Boxer einzeln ermittelt habe noch absteigend sortieren um die Top 10 der längsten Siegesserien zu erhalten.

Natürlich könnte ich ein PHP-Skript schreiben, welches mir die Infos ermittelt (z.B. könnte ich ja die Siegesserien in Zwischentabellen wegschreiben etc.).
Aber das wäre denke ich ein un performanter Weg - bei mehr als 5000 Kämpfen würde das sicher ne Zeit lang laufen.

Deshalb wollte ich mal fragen, ob hier jemand eine elegantere und intelligentere Idee hat wie man das ggf. auch datenbankseitig lösen könnte.

Vielen Dank vorab für alle hilfreichen Beiträge,
Thomas

  1. Hi.

    Ich denke für eine einzige SQL-Abfrage ist es zu komplex, da ich ja im Endeffekt pro Boxer ermitteln muss, wie viele Kämpfe IN FOLGE ohne Unterbrechnung durch Niederlagen gewonnen wurden, und das Ganze muss ich dann sobald ich das für jeden Boxer einzeln ermittelt habe noch absteigend sortieren um die Top 10 der längsten Siegesserien zu erhalten.

    Ich bin jetzt nicht gerade der Guru, was die Aggregatfunktionen in verschiedenen DBMS (welches benutzt Du?) angeht, aber ich habe auch die starke Vermutung, dass Du das mit einer Abfrage nicht ganz hinbekommen wirst.

    Natürlich könnte ich ein PHP-Skript schreiben, welches mir die Infos ermittelt

    Das wiederum dürfte kein allzu großes Problem sein. Du speicherst für jeden Kämpfer die Längen der aktuellen und längsten Siegesserie (anfangs alles 0), iterierst einmal über alle Kämpfe. Bei jedem Kampf setzt Du

    • beim Sieger die aktuelle Serie 1 hoch
    • beim Verlierer ggf. die längste Serie gleich der aktuellen, und die aktuelle auf 0.

    Das geht also in linearer Zeit (ohne die Sortierung der Kämpfe vom DBMS, die vorher natürlich stattfinden muss), und das Sortieren der Boxer danach in logarithmischer (in der Anzahl der Boxer). Sieht also nicht sehr problematisch aus.

    Deshalb wollte ich mal fragen, ob hier jemand eine elegantere und intelligentere Idee hat wie man das ggf. auch datenbankseitig lösen könnte.

    Was sich evtl. auch anbieten würde, wäre, die längste Serie jedes Boxers in der Datenbank zu führen und beim Eintragen von Kampf-Ergebnissen per Trigger zu aktualisieren. Das wäre praktisch überhaupt kein Aufwand. Redundanzen in Datenbanken sind oft schlecht, aber nicht immer.

    Viele Grüße,
    der Bademeister

  2. Tach auch.

    Deshalb wollte ich mal fragen, ob hier jemand eine elegantere und intelligentere Idee hat wie man das ggf. auch datenbankseitig lösen könnte.

    Du könntest aus dem Ansatz von bademeister statt einer PHP-Funktion auch eine Stored Procedure bzw. Stored Function machen, dann hast du die Logik in der Datenbank gekapselt.

    Bis die Tage,
    Matti

  3. moin,

    Nun möchte ich sortiert nach den längsten Siegesserien ermittelt, welche Boxer die meisten Kämpfe in Folge gewonnen haben.

    das ist nicht sonderlich komplex, zumal SQL sehr mächtig ist, wenn es darum geht, mit einer anweisung die gewünschten daten zu holen. mit einer wenig erfahrung ist die abfrage sogar trivial. viel wichtiger sind folgende dinge, die wir brauchen, um dir die abfrage zu geben.

    1. Beispieldaten, das beinhaltet auch das gewünschte ergebnis
    2. welches dbms benutzt du in welcher version.

    letzteres ist wichtig, weil korrelierte unterabfragen zum einsatz kommen werden.

    Ilja