MYSQL Parallele Updates

DonDemf

Erfahrenes Mitglied
Hallo Leute,
aktuell habe ich ein Script, welches die Rotenkarten aus einem Fußballspiel den Spieler in der DB zuordnet:

PHP:
  $sqlheimrot = mysql_query('SELECT * FROM fifa_rotekarten WHERE team = "'.$heim.'" AND spielid = "'.$id.'"') or die(mysql_error()); ## ermittle die tore
while($fetchheimrot = mysql_fetch_array($sqlheimrot)){   ##beginne die schleife mit tor nummer 1
         $sqlheimrot2 = mysql_query("UPDATE 
                                    fifa_spieler 
                              SET 
                                    rotekarte=rotekarte+1 
                              WHERE 
                                    id = '".$fetchheimrot["name"]."'
                              ");

Nun ändere ich dieses Script um, denn es soll für jede Rote karte eine Sperre von 2 Spieltagen hinzugefügt werden. Dies habe ich mit einer neuen Spalte vor:

PHP:
  $sqlheimrot = mysql_query('SELECT * FROM fifa_rotekarten WHERE team = "'.$heim.'" AND spielid = "'.$id.'"') or die(mysql_error()); ## ermittle die tore
while($fetchheimrot = mysql_fetch_array($sqlheimrot)){   ##beginne die schleife mit tor nummer 1
         $sqlheimrot2 = mysql_query("UPDATE 
                                    fifa_spieler 
                              SET 
                                    rotekarte=rotekarte+1,
                                    gesperrt=gesperrt+2  
                              WHERE 
                                    id = '".$fetchheimrot["name"]."'
                              ");

Nun möchte ich, dass alle anderen Spieler, die eventuell eine Sperre von 1,2,3 oder x haben in diesem Team einen Tag abgezogen bekommen, da ja ein Spiel vorbei ist.

Wie kann ich es am elegantesten Lösen, dass alle anderen Spieler eine gesperrt-1 erhalten?

LG
 
Das könnte etwa so gehen (Achtung, ist ungetestet)
SQL:
UPDATE	
	fifa_spieler AS spieler
	LEFT JOIN fifa_rotekarten AS karten
		ON spieler.id = karten.name
SET
	spieler.rotekarte = spieler.rotekarte + IF(karten.name IS NULL, 0, 1),
	spieler.gesperrt = spieler.gesperrt + CASE 
											-- Prüfen ob der Spieler in der Karten-Tabelle vorhanden ist
											-- Wenn ja, 2 Tage dazurechnen
											WHEN NOT (karten.name IS NULL) THEN 2
											-- Prüfe ob der Spieler noch Sperrtage hat
											-- Wenn ja, 1 Tag abziehen
											WHEN spieler.gesperrt<0 THEN -1
										  END
;
 
Danke erst einmal für die schnelle Hilfe, jetzt habe ich aber noch fragen:

Ausgehend hier von:

PHP:
$sqlheimrot = mysql_query('SELECT * FROM fifa_rotekarten WHERE team = "'.$heim.'" AND spielid = "'.$id.'"') or die(mysql_error()); ## ermittle die tore
while($fetchheimrot = mysql_fetch_array($sqlheimrot)){   ##beginne die schleife mit tor nummer 1
         $sqlheimrot2 = mysql_query("UPDATE  
    fifa_spieler AS spieler
    LEFT JOIN fifa_rotekarten AS karten
        ON spieler.id = karten.name                // Hier müssen doch nur die Einträge mit der Spieler.id = karten.name berücksichtigt werden UND wo spielid = id ODER?
SET
    spieler.rotekarte = spieler.rotekarte + IF(karten.name IS NULL, 0, 1),
    spieler.gesperrt = spieler.gesperrt + CASE 
                                            
                                            WHEN NOT (karten.name IS NULL) THEN 2
                                            // Müsste hier nicht noch nen ELSE Teil hin oder so?
                                            WHEN spieler.gesperrt<0 THEN -1
                                          END");

Habe mal die Fragen rein kommentiert?

Kann mir niemand weiter helfen? Dieser Ansatz scheint nicht zu funktionieren...

Ich habe mir jetzt nochmal Gedanken gemacht und bin auf folgende Idee gekommen:

PHP:
  $sqlheimrot = mysql_query('SELECT * FROM fifa_rotekarten WHERE team = "'.$heim.'" AND spielid = "'.$id.'"') or die(mysql_error()); ## ermittle die karten
while($fetchheimrot = mysql_fetch_array($sqlheimrot)){   ##beginne die schleife mit karte nummer 1
         $sqlheimrot2 = mysql_query("UPDATE 
                                    fifa_spieler 
                              SET 
                                    rotekarte=rotekarte+1, gesperrt=gesperrt+2 
                              WHERE 
                                    id = '".$fetchheimrot["name"]."'
                              ");
}

Hier wird der Spieler, der eine rote Karte erhalten hat eine sperre von 2 spielen auferlegt. Das ganze in einer schleife. D.h bekommen mehrere Spieler eine rote Karte, bekommen auch mehrere Spieler eine Sperre von 2 Spielen. So weit so gut.

Nun muss ich gucken, dass alle anderen Spieler eine gesperrt-1 erhalten, da ja ein Spiel gespielt wurde und die Sperre somit reduziert wird.

Theoretisch brauche ich doch jetzt nur ein weiteres Mysql update:
PHP:
$aendern = 'UPDATE fifa_spieler Set
gesperrt = gesperrt - 1 
WHERE id != "'.$fetchheimrot["name"].'" AND verein = "'.$heim.'" AND gesperrt > 0'; // bzw. Verein = $gast
$update = mysql_query($aendern);

Wenn ich das Update jetzt aber außerhalb der Schleife schreibe, dann führt er es aus, aber beispielweise ein anderer Spieler der im selben Spiel eine rote Karte bekommen hat, bekommt ebenfals ein gesperrt - 1!

Wenn ich es aber in der Schleife ausführe, bekommen andere Spieler nicht nur ein einziges gesperrt - 1 sondern eventuell 2 oder 3 mal (je nachdem wie viele rote karten es gab)......

Kann mir da wer weiterhelfen?

Ich bin am verzweifeln, weiß niemand ne hilfe?!
 
Zuletzt bearbeitet von einem Moderator:
Noch ein Versuch:

Mein Problem ist es ja nicht, den Spieler zu sperren, der eine rote Karte bekommen hat. Mein problem ist es, alle anderen Spieler zu checken, ob sie gegebenfalls gesperrt waren und ihre Sperre aufzuheben:

Beispiel:

Team X hat einen Spieler "BLA". Dieser Spieler hat in seiner spalte "gesperrt" eine 4 stehen. Sprich: er ist für 4 spiele gesperrt.
Nun hat Team X ein Spiel absolviert, ohne "Bla". Ein anderer Spieler "RAL" bekommt eine rote karte, d.h er bekommt ein gesperrt + 1. Weil er ja 0 hatte (freier Spieler) und er wird nun gesperrt. Gleichzeitig muss aber Spieler "Bla" ein gesperrt -1 erhalten, da er ja ein Spiel nicht gespielt hat.
Eigentlich kein Problem: Ich mach nen einfach update, indem ich sage: mache alle Spieler ein gesperrt - 1 außer bei Spieler "RAL", denn er hat ja ein gesperrt + 1 erhalten. und gut ist.

ABER, und jetzt wirds interessant:
Sollte in diesem Spiel neben Spieler "Ral" noch ein weiterer Spieler eine rote Karte bekommen, so würde er das Update nochmal durchführen. Und der Spieler "Bla" würde nicht nur einmal ein gesperrt -1 erhalten, sondern noch ein zweites mal. Ergebnis: Er hat ein Spiel pausiert, aber dafür 2 Sperren abgezogen bekommen.

Ich hoffe, ihr könnt mir folgen
 
Zurück