Auslesen von Werten aus SQL-DB & Kombination per Zufallsprinzip

sn original

Mitglied
Guten Abend zusammen ;-)

Ich bin es noch einmal mit einer Hürde, an der ich leider wieder hänge. Vorab nochmal: Vielen Dank für die SEHR schnelle und SEHR kompetente Hilfe Gestern! :-)

Also ich möchte nun folgendes machen .... Anhand eines Klicks auf den einen Button (das ist ja kein Thema), übermittle ich eine Liga-ID ... Nun rufe ich aus einer DB alle Teams ab, die diese LigaID ihr eigen nennen ... das sind genau 8. Heißt ich erhalte ein Array mit exakt 8 Zeilen.

Mein Wunsch ist folgender ... Ich will Werte dieser 8 Zeilen per Zufallsprinzip wiedergeben lassen ... Warum?

Ich will quasi einen Spielplan für eine gesamte Fußball-Saison auf Knopfdruck erstellen ... wie ich nachschaue, ob ein Spiel schon in der DB vorhanden ist, bekomme ich alles hin ... die Frage ist nur ... Wie kann ich bspw Zeile 1-8, welche Team 1-8 enthalten, per Zufall gegenüberstellen .... sodass ich 4 Paarungen bekomme, die ich dann eintragen kann ... Wie ich das ganze dann in eine Schleife packe, damit er es für alle Spieltage macht ist mir klar ...

Mir fehlt nur der Ansatz :-) Quelltext habe ich dafür leider noch gar keinen ... Weil mir der Ansatz fehlt.

Die Tabelle aus der abgerufen wird heißt team und hat folgende Struktur

Code:
id (int11), vereinsname (text), vereinslogo (text), ligaid (int11)

Hat Jemand eine Idee?! :-) Erneut wäre ich euch SEHR verbunden ... Da hier sehr viel fähige Menschen zu sein scheinen, suche ich die Anfangs-Hilfe (ich lerne ja noch), gern hier!

Ich danke euch für eine möglichst hilfreiche Antwort :-)

VG sn original

ps: Die Tabelle in die es eingetragen werden soll ist dann so aufgebaut:

Code:
id, saisonid, ligaid, hteamid, ateamid, htore, atore ( alle vom Typ int(11) )
(h und a ist dannlogischerweise heim und auswärts ;-)
 
Zuletzt bearbeitet:
Also wenn es nur darum geht diese 8 Einträge zufällig zu sortieren, dann kannst du am Ende der Abfrage noch "ORDER BY RAND()" schreiben.

Oder du machst es etwas "komplizierter" und fügst dem Ganzen eine Zufallszahl hinzu

SQL:
SELECT id, vereinsname, vereinslogo, ligaid, (RAND()*id) AS zufall FROM tabellenname ORDER BY zufall

Weiß nicht ob dir das schon ausreicht?
 
Ich sag einfach mal: VIELEN DANK! Ihr seid die Besten! :-) Werde direkt mal was zusammenbasteln und schauen, obs funktioniert, wie ich mir das vorstelle :-) Wenn ja, gibts natürlich Feedback... ;-) Werde mich in der Hinsicht aber natürlich weiterentwickeln, dass ich so einfache Sachen nicht mehr fragen brauch! :-)

LG
 
Ich poste einfach mal alles ... Jetzt ist die Fehlermeldung weg ... aber IRGENDWO hängt er in einer Schleife ... Sehe gerade kein Land ... finde den Fehler einfach nicht .. :-/ Hab für euch extra Vermerke geschrieben ... nen Fehler gibts nicht, die Seite lädt sich nur tot .... Der Fehler muss irgendwo zum Schluss bei der i++ und/oder s++ Anfrage sein ... denn wenn ich das if hteam ==1 ausblende und s++ und i++ einfach in die schleifen tue ... dann läufts durch ...

PHP:
<?php

include("connect.inc.php");

$saisonid = 1;
$ligaid = 1;

$teamquery = "select * from team where ligaid = $ligaid";
$teamresult = mysql_query($teamquery);

$h = 0; // Variable für Heimteamgesetzt
$i = 1; // Zählvariable für Durchlauf Spieltage
$s = 0; // Zählvariable für Durchlauf Spielpaarungen
$anzahl = mysql_num_rows($teamresult); // Variable, wie viele Teams in der Liga gefunden wurden

while($i < $anzahl) { // Hier sollen 8 Spieltage erstellt werden, deswegen i auf 0

$teamzufallquery = "select * from team where ligaid = $ligaid order by rand();";
$teamzufallresult = mysql_query($teamzufallquery); // bis hierhin ging noch alles (wenn man $i addiert pro Schleifenablauf)

while($team1 = mysql_fetch_array($teamzufallresult) && $s < 4) { // Schleife zur Spielpaarungserstellung pro Spieltag (wenn s=4, dann soll er den nächsten spieltag machen)

if($h == 0) { // noch kein Heimteam gesetzt

$hteamabfrage = $team1['vereinsname'];
$spielabfrage = "select * from spieltage where spieltag = '$i' and hteam = '$hteamabfrage' or spieltag = '$i' and ateam = '$hteamabfrage'";
$spielabfrage = mysql_query($spielabfrage); // Abfrage ob das team an dem spieltag schon eingetragen ist
$spielabfrage = mysql_num_rows($spielabfrage);
				
if($spielabfrage == 0) { $hteam = $team1['vereinsname']; $h = 1; } // wenn nein, dann als heimteam in variable, wenn ja, passiert nichts
			
}

if($h == 1) { // heimteam schon gesetzt

$ateam = $team1['vereinsname'];
$spielabfrage = "select * from spieltage where hteam = '$hteam' and ateam = '$ateam' or hteam = '$ateam' and ateam = '$hteam'";
$spielabfrage = mysql_query($spielabfrage); // abfrage ob spielepaarung schon in db
$spielvorhanden = mysql_num_rows($spielabfrage); // hier müsste er ja 0 zurückgeben, wenn er nichts findet
				
if($spielvorhanden == 0) { // wenn spiel nicht in db, dann eintragen und variablen setzen
				
$spieleintragen = "insert into spieltage ('spieltag','saisonid','ligaid','hteam','ateam') VALUES ('$i','$saisonid','$ligaid','$hteam','$ateam')";
$spieleintragen = mysql_query($spieleintragen);
$h = 0;
$spielanzahlspieltag = "select * from spieltage where spieltag = $i";
$spielanzahlspieltag = mysql_query($spielanzahlspieltag);
$spielanzahlspieltag = mysql_num_rows($spielanzahlspieltag);
								
if ($spielanzahlspieltag < 4) { $s++; }
if ($spielanzahlspieltag == 4) { $i++; }
			
}

}

}

}

?>
 
Zuletzt bearbeitet:
Ist es bei mir ja :-)

Aber wenn ich das hier so reinkopiere, dann sind da 10.000 Zeilenumbrüche, weil das Fenster zur Code-Darstellung hier kleiner ist :-)
 
Ist es bei mir ja :-)

Aber wenn ich das hier so reinkopiere, dann sind da 10.000 Zeilenumbrüche, weil das Fenster zur Code-Darstellung hier kleiner ist :-) Aber okay ... hier ist es mal mit Tabs ...

Übrigens ... Soweit konnte ich es schon eingrenzen: Der Fehler muss innerhalb der letzten if Abfrage if($h==2) liegen .... Aber wo, ist mir immernoch unklar :-/

PHP:
<?php

include("connect.inc.php");

$saisonid = 1;
$ligaid = 1;

$teamquery = "select * from team where ligaid = $ligaid";
$teamresult = mysql_query($teamquery);

$h = 0; // Variable für Heimteamgesetzt
$i = 1; // Zählvariable für Durchlauf Spieltage
$s = 0; // Zählvariable für Durchlauf Spielpaarungen
$anzahl = mysql_num_rows($teamresult); // Variable, wie viele Teams in der Liga gefunden wurden

while($i < $anzahl) { // Hier sollen 8 Spieltage erstellt werden, deswegen i auf 0

$teamzufallquery = "select * from team where ligaid = $ligaid order by rand();";
$teamzufallresult = mysql_query($teamzufallquery); // bis hierhin ging noch alles (wenn man $i addiert pro Schleifenablauf)

while($team1 = mysql_fetch_array($teamzufallresult) && $s < 4) { // Schleife zur Spielpaarungserstellung pro Spieltag (wenn s=4, dann soll er den nächsten spieltag machen)

	if ($h == 1) { $h = 2;}
	if($h == 0) { // noch kein Heimteam gesetzt

					$hteamabfrage = $team1['vereinsname'];
					$spielabfrage = "select * from spieltage where spieltag = $i and hteam = '$hteamabfrage' or spieltag = '$i' and ateam = '$hteamabfrage'";
					$spielabfrage = mysql_query($spielabfrage); // Abfrage ob das team an dem spieltag schon eingetragen ist
					$spielabfrage = mysql_num_rows($spielabfrage);
				
					if($spielabfrage == 0) { $hteam = $team1['vereinsname']; $h = 1; } // wenn nein, dann als heimteam in variable, wenn ja, passiert nichts

				}

   if($h == 2) { // heimteam schon gesetzt

					$ateam = $team1['vereinsname'];
					$spielabfrage = "select * from spieltage where hteam = '$hteam' and ateam = '$ateam' or hteam = '$ateam' and ateam = '$hteam'";
					$spielabfrage = mysql_query($spielabfrage); // abfrage ob spielepaarung schon in db
					$spielvorhanden = mysql_num_rows($spielabfrage); // hier müsste er ja 0 zurückgeben, wenn er nichts findet
				
					if($spielvorhanden == 0) { // wenn spiel nicht in db, dann eintragen und variablen setzen
				
								$spieleintragen = "insert into spieltage ('spieltag','saisonid','ligaid','hteam','ateam') VALUES ($i,$saisonid,$ligaid,'$hteam','$ateam')";
								$spieleintragen = mysql_query($spieleintragen);
								$h = 0;
								$spielanzahlspieltag = "select * from spieltage where spieltag = $i";
								$spielanzahlspieltag = mysql_query($spielanzahlspieltag);
								$spielanzahlspieltag = mysql_num_rows($spielanzahlspieltag);
								
								if ($spielanzahlspieltag < 4) { $s++; }
								if ($spielanzahlspieltag == 4) { $i++; }
			
											} 

				}	 

}

}

?>
 
Zuletzt bearbeitet:
Irgendwie sehr kompliziert dein Script.
Ich würde zuerst elle Teams in ein Array laden und dann mit dem arbeiten.


So auf die Schnelle würd ich es so lösen. Denn jeder DB-Zugriff ist Performance-Verlust
PHP:
$saisonid = 1;
$ligaid = 1;
$anzSpielTage = 1;
$anzSpielePerTag = 4;

//Array mit allen Teams erstellen
$sql = "select * from team where ligaid = {$ligaid}";
$result = mysql_query($sql);
while($team = mysql_fetch_array($result)){
    $teams[] = $team['vereinsname'];
}

//Jeden Spieltag durchgehen
for($spieltag = 1; $spieltag <= $anzSpielTage; $spieltag++){
    //Teams neu mischen
    shuffle($teams);
    //Eine Kopie der Teams anlegen (array_shift() nimmt jeweils ein Eintrag aus dem Array heraus, 
    //ergo die Kopie wird immer kleiner
    $teamsCopy = $teams;
    
    //$anzSpielePerTag oder weniger Spiele (wenn zu wenig Manschaften vorhanden sind) aussuchen
    for($i=0; $i < min($anzSpielePerTag, floor(count($teams)/2)); $i++){
        $hteam = array_shift($teamsCopy);
        $ateam = array_shift($teamsCopy);
        //Den Match fürs SQL vorbereiten
        $matchSqls[] = "('{$spieltag}','{$saisonid}','{$ligaid}','{$hteam}','{$ateam}')";
    }
}

//Die Matches mit einem einzigen DB-Zugriff eintragen
$sql = "INSERT INTO spieltage ('spieltag','saisonid','ligaid','hteam','ateam') VALUES ".implode(',', $matchSqls);
mysql_query($sql);
 
Zurück