[PHP] Fussball spezielle Abfrage

Sammler

Well-known member
ID: 17948
L
23 Januar 2007
65
0
Jeder Fussballfan kennt doch die Infos, z.B. der FC Bayern ist seit 10 Spielen ungeschlagen.

Oder für nicht Bayernfans, "Seit 4 Spielen hat der FC Bayern nicht mehr gewonnen" ;)

Diese Infos will ich auf der Statistikseite von meinem Tippspiel ausgeben.
Nur hab ich aktuell kein Plan wie ich das hinbekomme.

Die Daten liegen so vor

| ID | Team ID | Team | Spieltag | Heim/Auswärts | Sieg,Unent,Niederl. | Erg | Punkte | Toreplus | Toreminus

| 1 | 2 | FC Bayern | 1 | 1 | 1 | 3:0 | 3 | 3 | 0
| 2 | 2 | FC Bayern | 2 | 0 | 1 | 1:2 | 3 | 2 | 1
| 3 | 2 | FC Bayern | 3 | 1 | 1 | 2:0 | 3 | 2 | 0
| 4 | 2 | FC Bayern | 4 | 0 | 1 | 2:3 | 3 | 3 | 2

Ich stellte mir das so vor.
Zuerst schauen wie das letzte Spiel endete.
In dem Fall "Sieg"
Dann schauen wie viele der letzten Spiele ebenfalls Siegreich waren.
In dem Fall würde 4 Rauskommen.

Soweit so gut.
Was ist, wenn nun das 2. Spiel untentschieden ausging.
Dann müste die Abfrage beim 2 Spiel beendet werden.
Und es müsste dann als Ergebniss "seit 2 Spielen ungeschlagen" rauskommen.

Select From Tabelle where Bedingung = Ergebnis letztes Spiel ORDER by ID DESC ( und nur bis zum Ersten eintrag der nicht der Bedinung entspricht)

Ich hoffe ihr versteht was ich meine ;)
 
am einfachsten wäre es du würdest noch speichern ob die Mannschaft das Spiel gewonnen hat, verloren hat oder es unentschieden ausging.

Z.B. noch Endgame mit den werten 0-3

0= noch nicht gespielt
1= gewonnen
2= verloren
3= unentschieden

Dann kannst du ne abfrage machen und dir die letzten Spiele mit status 1 ausgeben lassen.

So wie es jetzt ist müsstest du dann jedes Spiel ausrechnen und das geht zu lasten der DB bei einer größeren Auswertung
 
machs dir einfacher ;-)

2 tabellen
1. tabelle vereine
2. tabelle spiele

und folgenden aufbau

vereine
====================
id | name | win_loose | count
int | varchar | int | int

spiele
=====================
home | guest | home_goal | guest_goal
int | int | int | int

so wenn du jetzt ein spiel einträgst überprüfst du in der tabelle verrein ob die manschaft die gewonnen hat bei win_loose ne 1 stehen hat wenn ja erhöhst du count um 1 bei nein setzt du count auf 1 und win_loose auch auf 1

bei der verlierermanschaft gehst du genauso vor nur überprüfst du ob win_loose auf 0 steht


so hast du das relativ einfach gelöst

den die andere abfrage wäre
SELECT ergebnis as lastergebnis FROM spiele WHERE heimmanschaft = verein or gastmanschaft = verein ORDER BY id DESC LIMIT 1
SELECT * FROM spiele WHERE heimmanschaft = verrein AND ergebnis = lastergebnis ORDER BY id DESC

jetzt musst du die liste durchlaufen
count =0;
ende=false;
while(mysql_fetch_assoc($query) && ende==false){
if(ergebnis=lastergebnis ){
count++
}else{
ende=true;
}
}

somit müsstest du erst die GESAMTE tabelle einlesen um dann nur die letzten x einträge zu benutzen
 
machs dir einfacher ;-)...
Das ist garantiert nicht einfacher. Dann könnte man auch gleich die Datensätze durchgehen und nach 3 Punkten suchen. Eigentlich schon mal was von break gehört?

Ob es da noch eine intelligentere und vorallem datenbanktechnisch bessere Lösung gibt und wie die dann aussieht, würde mich natürlich in dem doch sehr speziellen Fall sehr interessieren.
 
Danke für den Input, hab nicht mehr damit gerechnet :)

Zu dem Tabellen, ich hab einige :D

Eine wo die Teams drin sind, eine wo die Punkte drin sind, und eine wo die Ergebnise drin sind.

Es steht dort auch drin, ob man gewonnen, verloren, oder unentschieden gespielt hat. Ich hab an alles gedacht ;)

Dann kannst du ne abfrage machen und dir die letzten Spiele mit status 1 ausgeben lassen.

@betterchat_de
Schon klar, aber das ist nicht so leicht wie du denkst.
Wenn es z.B. 5 Datensätze gibt, davon sind die letzten 3 ein Sieg und das vorletzte ne Niederlage und das erste wieder ein Sieg.

Wenn ich nun alles mit Sieg Abfragen würde, käme eine 4 dabei raus.
Aber die Siegesserie wurde ja unterbrochen, also es dürfte nur eine 3 dabei rauskommen.

@ Aradiv
Den Aufbau hab ich blos mit anderen Feld Namen, aber sonnst passt das.
Das mit dem Count hört sich interessant an, ist aber wahrscheinlich zu kompliziert. Denn es gibt Sieges Serien, und Niederlagen, oder unentschieden, oder seit 5 Spielen nicht mehr gewonnen.....
Da müsste man zu viele Counts einbauen.

Ich hab noch was gegrübelt, und eine eventuell schnellere und bessere Methode ausgedacht.

Gehen wir vom Sieg aus, dann prüfe ich in der Tabelle wann des Letzte Spiel nicht gewonnen wurde. Dann zähle ich die Einträge nach dieser ID. Kommen dann noch 3, müssten das alles siege sein.

Aber das mit dem Break hört sich auch gut an, werde mal googeln.

Edit, das mit dem Break bringt nix.
Da müsste ich ja in der Schleife prüfen, ob die Bedingung noch stimmt.
Desweiteren, was ist das Limit der Schleife ?
Ich kann ja nicht nur die letzten 10 Spiele in der Schleife prüfen.
Es soll ja Teams geben, die 15 Spiele hintereinander nicht gewinnen.

Ich dachte an eine simple Count Abfrage, aber nicht an eine große Schleife die Resourchen verbrät.
Zumal es ja mehrere solche Infos geben soll.

Zum Beispiel seit 10 Spielen ungeschlagen und 8 Spiele in Folge gewonnen.
Das wären dann zu viele Schleifen :)
 
Zuletzt bearbeitet:
Ich würde mir das so vorstellen:
  1. Abfragen, ob letztes Spiel gewonnen oder verloren (Beispiel: gewonnen)
  2. Abfragen, welches das letzte Spiel war, das nicht gewonnen wurde
  3. Differenz der Spieltage bilden (Aktuell: Spieltag 7; letztes nicht gewonnenes Spiel Spieltag 3 => 4 Spiele in Folge gewonnen)
So hast du das ganze mit 2 Abfragen gelöst und brauchst keinen weiteren Schleifen!

Gruß,
MrToiz
 
gute Idee Mr Toiz, auf die triviale Lösung bin ich gar net gekommen.
Das ließe sich dann ja sogar mit einem Query und 2 Subquerys lösen.
 
@ MrToiz

genau das war ja mein gemeinter Vorschlag von oben.
Hab das mal umgesetzt.

Hat leider ein kleinen Bug :)

Damit kann ich nur ausgeben, wie lange die Manschaft ungeschlagen oder Sieglos ist.

Also nur eine entweder oder Entscheidung.
Aber ich wollte 3 Zustände, also das unentschieden noch zusätzlich mit einbeziehen.
 
Wie wäre es so:

Code:
SELECT match_result, 
spieltag -  
(SELECT spieltag FROM match_result WHERE team = 'xy'  AND match_result !=

    (SELECT match_result FROM matches WHERE team = 'xy' ORDER BY id
     DESC LIMIT 0,1)

ORDER BY id DESC LIMIT 0,1

) AS differenz FROM matches WHERE team = 'xy' ORDER BY id DESC LIMIT 0,1

Bin nicht sicher ob es funktioniert und ist sicherlich auch nicht effizient, aber mal als Idee ;)