Serie feststellen

Hillary

Mitglied
Serie feststellen - Schwierigkeiten mit Subselect

Hallo zusammen. Ich benötige eure Hilfe, da ich leider hier und im Netz nicht fündig geworden bin, und die Grenzen meines Wissens wohl überschritten sind.

Ich habe eine Mysql-Tabelle, in denen Spielergebnisse abgelegt werden:

(Auszug; Struktur ist aus mehreren Gründen fix)
datum / gewonnen / unentschieden / verloren
2005-03-01 0 1 0
2005-02-02 0 1 0
2005-02-01 1 0 0
2005-01-14 0 0 1
etc...

Nun möchte ich die aktuelle Serie feststellen und ausgeben. In diesem Beispiel 2 Unentschieden. Prüfen, vergleichen, zählen....einfach zuviel für mich.

Freu mich schon über einen kleinen Ansatz/Tipp
 
Zuletzt bearbeitet:
Serie = "Current Streak"
In der Spielerstatistik soll die aktuelle Erfolgsserie dargestellt werde.
Beispiel: Spieler A hat 5 Siege in Folge ("5 Siege"). Verliert er einmal soll die
aktuelle Serie "1 Niederlage" lauten. (Anhand der Reihenfolge des Datums festgestellt)
 
In meinem Kopf sieht die Theorie so aus: Prüfen in welcher Spalte beim letzten Eintrag (nach Datum) die 1 steht. Dann feststellen wie oft die 1 in dieser Spalte in den chronologisch (nach Datum) vorhergehenden Datensätzen noch vorkommt, bis eine 0 eingetragen ist.
 
Hallo!

Ich denke da wirst du um ein paar Abfragen nicht drum herum kommen...

Code:
Beispieldaten:
create table matches (datum date, gewonnen int, unentschieden int, verloren int);

insert into matches values(DATE_SUB(CURDATE(),INTERVAL 1 DAY),1,0,0);
insert into matches values(DATE_SUB(CURDATE(),INTERVAL 10 DAY),1,0,0);
insert into matches values(DATE_SUB(CURDATE(),INTERVAL 20 DAY),1,0,0);
insert into matches values(DATE_SUB(CURDATE(),INTERVAL 30 DAY),1,0,0);
insert into matches values(DATE_SUB(CURDATE(),INTERVAL 40 DAY),1,0,0);

5: Siege in folge:

mysql> select * from matches;
+------------+----------+---------------+----------+
| datum      | gewonnen | unentschieden | verloren |
+------------+----------+---------------+----------+
| 2005-03-20 |        1 |             0 |        0 |
| 2005-03-11 |        1 |             0 |        0 |
| 2005-03-01 |        1 |             0 |        0 |
| 2005-02-19 |        1 |             0 |        0 |
| 2005-02-09 |        1 |             0 |        0 |
+------------+----------+---------------+----------+
5 rows in set (0.00 sec)

mysql> select count(*) from matches where datum > (select COALESCE(max(foo.dat),0) from (select max(datum) as dat from matches where verloren =1 OR unentschieden = 1) foo);
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set, 1 warning (0.00 sec)

Niederlage vor 21 Tagen einführen:
insert into matches values(DATE_SUB(CURDATE(),INTERVAL 21 DAY),0,0,1);

mysql> select * from matches order by datum desc;
+------------+----------+---------------+----------+
| datum      | gewonnen | unentschieden | verloren |
+------------+----------+---------------+----------+
| 2005-03-20 |        1 |             0 |        0 |
| 2005-03-11 |        1 |             0 |        0 |
| 2005-03-01 |        1 |             0 |        0 |
| 2005-02-28 |        0 |             0 |        1 |
| 2005-02-19 |        1 |             0 |        0 |
| 2005-02-09 |        1 |             0 |        0 |
+------------+----------+---------------+----------+
6 rows in set (0.01 sec)

-> Siege in Folge 3:

mysql> select count(*) from matches where datum > (select COALESCE(max(foo.dat),0) from (select max(datum) as dat from matches where verloren =1 OR unentschieden = 1) foo);
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.01 sec)

... hoffe das hilft dir ein wenig weiter, mit den Niederlagen und Unentschieden geht's analog...

HTH,

Gruß Tom
 
Danke Tom! Mit so einer ausführlichen Antwort habe ich nicht gerechnet. Toll!

Verschachteltes Select hatte ich ich bisher nicht angewendet. Daher klappt die Umsetzung auch nicht einwandfrei. Ich habe folgendes probiert:

PHP:
$sql15 = " SELECT COUNT (*)
			FROM kpl_dietmar
			WHERE datum IN
			(SELECT COALESCE(max(foo.dat),0) 
			FROM (SELECT MAX(datum) as dat 
			FROM kpl_dietmar
			WHERE verloren = 1 OR 
			unent = 1) foo)
			;"
			$ergebnis15 = mysql_query($sql15);
			while($row = mysql_fetch_row($ergebnis15))
			{
			$seriegew = $row[0];
			}
			echo $seriegew;
(Anmerkung: mit und ohne "IN" versucht;
Tabellen und Feld/Spaltenbezeichnungen stimmen)

zur Zeile
PHP:
$ergebnis15 = mysql_query($sql15);
ensteht der Fehler:
"parse error, unexpected T_VARIABLE" wobei ich sicher bin, dass der Fehler bereits in der Subselect-Abfrage steckt. Ich muss leider anmerken, dass ich selbst mit der Ausgabe wahrscheinlich nicht ins schwarze getroffen habe.

Hab versucht mich über Subselect schlau zu machen. Leider nur mit begrenztem Erfolg. Allerdings könnte der Hinweis "Subselects werden von MySQL nicht unterstützt" hilfreich sein!? Habe Version 4.0.24

Nochmals Danke an Tom für die ausführliche Antwort.

P.S. Eingrenzung nach Datum (21 Tage) ist nicht notwendig
 
Zurück