Ligatabelle/Ergebnisse und Spielplan erstellen!

andy_tz

Mitglied
Hallo Leute,

ich bin für unseren Sportverein eine Homepage am erstellen. Die soll auch eine aktuelle Ligatabelle / Ergebnisse (nur unseres Vereins) und einen Spielplan enthalten.

Die Datenbank hierzu besteht aus 2 Tabellen:

Verein
Code:
CREATE TABLE `vereine` (
  `verein_id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(64) COLLATE latin1_general_cs NOT NULL DEFAULT '',
  PRIMARY KEY  (`verein_id`)
);

Spiele
Code:
CREATE TABLE `spiele` (
  `spiel_id` INT(11) NOT NULL AUTO_INCREMENT,
  `spieltag` INT(11) NOT NULL DEFAULT '0',
  `heim_id` INT(11) NOT NULL DEFAULT '0',
  `gast_id` INT(11) NOT NULL DEFAULT '0',
  `heim_tore` INT(11) NOT NULL DEFAULT '0',
  `gast_tore` INT(11) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`spiel_id`)
);

Alle Vereine sind bereits in der Datenbank eingetragen! Nun habe ich einige Fragen bei denen ich nicht ganz weiter komme...

Ich habe eine Ligatabelle mit folgenden Code erstellt:

PHP:
<?php
		
		$abfrage = 'SELECT
  						`v`.*,
  
  					COUNT(`s`.`spiel_id`) AS `spiele_gesamt`,
  
  					SUM(
    					IF(
      						(`v`.`verein_id` = `s`.`heim_id` AND `s`.`heim_tore` > `s`.`gast_tore`) OR
      						(`v`.`verein_id` = `s`.`gast_id` AND `s`.`gast_tore` > `s`.`heim_tore`),
      						1, 0
    					)
  					) AS `siege`,
  
  					SUM(
    					IF(`s`.`heim_tore` = `s`.`gast_tore`, 1, 0)
  					) AS `unentschieden`,
 
  					SUM(
    					IF(
      						(`v`.`verein_id` = `s`.`heim_id` AND `s`.`heim_tore` < `s`.`gast_tore`) OR
      						(`v`.`verein_id` = `s`.`gast_id` AND `s`.`gast_tore` < `s`.`heim_tore`),
      						1, 0
    					)
  					) AS `niederlagen`,
 
					SUM(
    					IF(`v`.`verein_id` = `s`.`heim_id`, `s`.`heim_tore`, 0) +
    					IF(`v`.`verein_id` = `s`.`gast_id`, `s`.`gast_tore`, 0)
  					) AS `tore`,
 
  					SUM(
    					IF(`v`.`verein_id` = `s`.`heim_id`, `s`.`gast_tore`, 0) +
    					IF(`v`.`verein_id` = `s`.`gast_id`, `s`.`heim_tore`, 0)
  					) AS `gegentore`,
 
  					COALESCE(
    					SUM(
      						IF(`v`.`verein_id` = `s`.`heim_id`, `s`.`heim_tore`, -`s`.`heim_tore`) +
      						IF(`v`.`verein_id` = `s`.`gast_id`, `s`.`gast_tore`, -`s`.`gast_tore`)
    					), 0
  					) AS `tordifferenz`,
 
  					SUM(
    					IF(
      						(`v`.`verein_id` = `s`.`heim_id` AND `s`.`heim_tore` > `s`.`gast_tore`) OR
      						(`v`.`verein_id` = `s`.`gast_id` AND `s`.`gast_tore` > `s`.`heim_tore`),
      						3, 0
    					) +
    					IF(`s`.`heim_tore` = `s`.`gast_tore`, 1, 0)
  					) AS `punkte`
 
					FROM
  						`vereine` `v`
 
					LEFT JOIN
  						`spiele` `s` ON (`v`.`verein_id` IN (`s`.`heim_id`, `s`.`gast_id`))
 
					GROUP BY
  						`verein_id`
 
					ORDER BY
  						`punkte` DESC,
  						`tordifferenz` DESC,
  						`tore` DESC';
						
		if(!$season_table = $mysqli->query($abfrage)) {
    		die($mysqli->error);
		}
		
		echo '<table class="season_table table table-bordered">
  			<thead>
				<tr>
    				<th>Platz</th>
    				<th>Verein</th>
    				<th>Spiele</th>
    				<th>S</th>
    				<th>N</th>
    				<th>U</th>
    				<th>Tore</th>
    				<th>TD</th>
    				<th>Punkte</th>
				</tr>
  			</thead>';
		
		while ($row = $season_table->fetch_object())  {
			
			echo '<tbody>
  				<tr>
    				<td>&nbsp;</td>
    				<td>&nbsp;</td>
    				<td>'. $row->spiele_gesamt .'</td>
    				<td>'. $row->siege .'</td>
    				<td>'. $row->unentschieden .'</td>
    				<td>'. $row->niederlagen .'</td>
    				<td>'. $row->tore .' : '. $row->gegentore .'</td>
    				<td>'. $row->tordifferenz .'</td>
    				<td>'. $row->punkte .'</td>
  				</tr>
			</tbody>';
		}
		
		echo '</table>';
		
        ?>

Meine Frage wäre, wie ich in der erstellten Tabelle die aktuelle Platzierung und den dazugehörigen Vereinsnamen ausgeben kann****?

Meine nächsten Fragen wären, wie ich alle Spiele am einfachsten in die Datenbank schreibe und daraus einen Spielplan erstellen kann?


Ich hoffe Ihr könnt mir weiterhelfen, denn solangsam bin ich etwas am verzweifeln :(

LG Andreas
 
Mit deiner ersten Frage kann ich irgendwie nicht anfangen. Der Code ist auch recht schwer zu lesen. Als erstes würde mich interessieren, ob die Daten nach einer Saison gelöscht werden oder du die Datenbank für mehrere Saisons verwenden willst? Wenn ja müsstes du noch eine Tabelle hinzufügen
Code:
CREATE TABLE `saison` (
  `verein_id` INT(11),
  `saison` Varchar(50) COLLATE latin1_general_cs NOT NULL DEFAULT,
  `punkte` VARCHAR(64) COLLATE latin1_general_cs NOT NULL DEFAULT,
);

Abfragen tust du wiefolgt
Code:
SELECT * FROM saisons AS Saison INNERJOIN verein AS Verein ON (Verein.verein_id = Saison.Verein.id) WHERE Saison.saison = `2012/2013` ORDER BY Saison.punkte ASC

Was meinst du bei deiner zweiten Frage genau? Willst du wissen, wie du alle Kombinationen hineinbekommst? Das einfachste wäre hier in meinen Augen zwei Arrays zu bilden, die jeweils die verein_id innehalten. Dann iterierst du durch beide Arrays durch
PHP:
for($i=0; $i<count($array1); $i++){
    for($j = 1; $j<count($array2)+1;$j++){
    //Begegnung des Tages
    echo $i." gegen ".$j;
    }
}


Gruß
 
Hallo,

zu meiner ersten Frage - Wie du siehst habe ich die Tabelle in der while-Schleife nicht komplett ausgefüllt.

Die Ausgabe der Tabelle sieht aktuell so aus:
tabelle.jpg

Die Sache das die Vereinsnamen nicht angezeigt werden habe ich gelöst! Mir geht es jetzt um die Auswertung der Platzierung. Dafür fehlt mir eine Abfrage!

Zu deiner Frage, die Tabelle ist immer nur für ein Jahr gedacht. Daten werden nach der Saison wieder gelöscht.

Die zweite Frage war vielleicht etwas schlecht formuliert. Wenn alle Begegnungen feststehen, werde ich diese in meine Datenbank eintragen. Da die Frage wie ich das am einfachsten/schnellsten lösen kann. Dann sollen noch alle Begegnungen ausgegeben werden. Aber nur diese die unseren eigenen Verein betreffen.


Beispiel:

Verein1 = Verein2
Verein8 = Verein5
Verein4 = Verein3
Verein7 = Verein9
Verein1 = Verein6

Gehen wir von aus das unser Verein die ID=1 hat und ausschliesslich diese Begenungen möchte ich dann ausgeben!

Gruß und schon mal vielen Dank im Voraus!
 
Zuletzt bearbeitet:
PHP:
//Annahme: Dein Verein hat die ID 1
SELECT 
  Heim.name, Gast.name 
FROM  
  `spieltag` AS Spieltag
LEFT JOIN  
  `vereine` AS Heim 
   ON ( 
    Spieltag.verein_id = Heim.verein_id 
   ) 
LEFT JOIN  
  `vereine` AS Heim 
   ON ( 
    Spieltag.verein_id = Gast.verein_id 
   ) 
WHERE Heim.verein_id = 1 OR Gast.verein_id = 1
 
Hallo Kalio,

danke für deine Antwort! Mit der Abfrage der Platzierung habe ich eine Lösung gefunden.

Ich benötige jetzt noch eine Funktion um die Begegnungen in die Datenbank eintragen zu lassen. Habe zu Testzwecken einfach mit phpMyAdmin ein Paar Ergebnisse in die Tabelle eingetragen...

Ist alles doch etwas umständlich!
 
Zuletzt bearbeitet:
Nunja du könntest eine Abfrage erstellen, welcher dir für einen Spieltag alle Partien übergibt. Zu jeder Partie zeigst du zwei Inputfelder an, wo die Tore eingetragen werden können. Beim Absenden iterierst du dann durch die Eintragungen und speicherst diese in die DB.

Nur mal so als Anmerkung. Wären Karten und Auswechslungen nicht auch von Interesse?
 
Hallo,

nein Karten und Auswechslungen benötige ich nicht, da dies eine Tabelle für Tischfussball ist. Aber trotzdem Danke. Ich denke das ich für die Spielpaarungen eine eigene Tabelle erstellen muss. Denn wenn ich die Begegnungen in die Datenbank schreibe werden diese in der Ligatabelle als "unentschieden" gewertet. Außerdem benötige ich noch das komplette Ergenbis des Spiels

Beispiel:

Team1 - Team2 Ergebnis: 14:10 (dies wird in Sätzen gewertet und nicht in Toren wie beim Fußball)

die erziehlten Tore benötige ich aber trotzdem für die Ligatabelle. Deswegen wollte ich eigentlich folgende weitere Tabelle in der Datenbank anlegen:

Begegnungen
Code:
CREATE TABLE `begegnungen` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `datum` VARCHAR(30) NOT NULL,
  `spieltag` INT(11) NOT NULL DEFAULT '0',
  `heim_id` INT(11) NOT NULL DEFAULT '0',
  `gast_id` INT(11) NOT NULL DEFAULT '0',
  `heim_ergebnis` INT(11),
  `gast_ergebnis` INT(11),
  PRIMARY KEY  (`id`)
);

Darüber würde ich dann die Begegnungen und evtl. schon vorschliegenden Ergebnisse auslesen!

Wie müsste ich dann die o. g. Abfrage
PHP:
//Annahme: Dein Verein hat die ID 1 
SELECT  
  Heim.name, Gast.name  
FROM   
  `spieltag` AS Spieltag 
LEFT JOIN   
  `vereine` AS Heim  
   ON (  
    Spieltag.verein_id = Heim.verein_id  
   )  
LEFT JOIN   
  `vereine` AS Heim  
   ON (  
    Spieltag.verein_id = Gast.verein_id  
   )  
WHERE Heim.verein_id = 1 OR Gast.verein_id = 1

verändern wenn die Tabelle "Begenung" hinzu kommt und die Spalte "Spieltag" in der Tabelle->Spiele nicht mehr vorhanden ist****?
 
Zuletzt bearbeitet:
du musst für die Begegnung nicht eine extra Tabelle machen. Es reicht doch aus, wenn du dies an die Spieltagtabelle hängst
Code:
CREATE TABLE `spiele` (
  `spiel_id` INT(11) NOT NULL AUTO_INCREMENT,
  `spieltag` INT(11) NOT NULL DEFAULT '0',
  `heim_id` INT(11) NOT NULL DEFAULT '0',
  `gast_id` INT(11) NOT NULL DEFAULT '0',
  `heim_tore` INT(11) NOT NULL DEFAULT '0',
  `gast_tore` INT(11) NOT NULL DEFAULT '0',
  `heim_ergebnis` INT(11),
  `gast_ergebnis` INT(11),
  PRIMARY KEY  (`spiel_id`)
);

Das würde auch deine ganze Abfrage vereinfachen, da du die Tabelle mit einem Rutsch auslesen kannst.
 
Hi,

ja hatte ich erst so, naja könnte ich natürlich auch so machen. Wie würde denn die Abfrage und Ausgabe in einer while-Schleife aussehen?

Diese Abfrage:
PHP:
//Annahme: Dein Verein hat die ID 1 
SELECT  
  Heim.name, Gast.name  
FROM   
  `spieltag` AS Spieltag 
LEFT JOIN   
  `vereine` AS Heim  
   ON (  
    Spieltag.verein_id = Heim.verein_id  
   )  
LEFT JOIN   
  `vereine` AS Heim  
   ON (  
    Spieltag.verein_id = Gast.verein_id  
   )  
WHERE Heim.verein_id = 1 OR Gast.verein_id = 1
erzeugt folgende Fehlermeldung "Not unique table/alias: HEIM", da man eine Tabelle nur einmal JOINEN kann soweit ich das richtig gelesen habe.
 
Man kann in MySQL bis zu 61 Mal JOINEN ;)
Du musst der Tabelle, die du mehrmals JOINen willst nur mehrere Aliase geben .
 
Zurück