Datensätze nach Datum zusammenfassen

dodge11

Mitglied
Hallo,

ich möchte mir auf einer Seite meiner Homepage eine Spieltagsübersicht ausgeben lassen.

Das habe ich so gemacht.

PHP:
<table border="0">
	<?php
	$sel2 = mysql_query("SELECT
							spiel_id,
							spiel.mannschaft,
							datum,
							uhrzeit,
							heim,
							gast,
							egheim,
							eggast,
							intern_mannschaft.id,
							intern_mannschaft.mannschaft
						  FROM
						 	spiel
						 	LEFT JOIN halle ON (halle.id=spiel.halle)
							LEFT JOIN intern_mannschaft ON (intern_mannschaft.id=spiel.mannschaft)
						 ORDER BY
						 	spiel.datum
						 ASC")
	or die (mysql_error());

	if($p = mysql_num_rows($sel2) > 0) {

		while($row2 = mysql_fetch_object($sel2)) {
			$d = explode("-", $row2->datum);
			if(isset($d[0]) AND isset($d[1]) AND isset($d[2])) {
				$datum = $d[2].".".$d[1].".".$d[0];
			}
			else { $datum = ""; }
			echo "
			
			<tr>
				<td colspan=\"8\" bgcolor=\"#FF0000\" align=\"left\"><font color=\"#FFFFFF \" face=\"Verdana \" style=\"font-size: 8pt \"><b>".$datum."</b></font></td>
			</tr>
			<tr>
				<td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->uhrzeit."</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->heim."</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">-</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->gast."</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">(".$row2->mannschaft.")</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->egheim."</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">:</td>
				<td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->eggast."</td>
			</tr>
			
			<tr>
				<td>&nbsp;</td>
			</tr>
			";
		}
	}
	else {
		echo "
		<tr>
			<td colspan=\"8\" bgcolor=\"#FF0000\" align=\"left\"><font color=\"#FFFFFF \" face=\"Verdana \" style=\"font-size: 8pt \"><b>ERROR</b></font></td>
		</tr>
		<tr>
			<td colspan=\"8\">Zurzeit ist leider kein Spielplan verfügbar</td>
		</tr>
		";
	}

	?>
<br \>
<br \>
<br \>
</table>

Dieses Script erzeugt eine Tabelle, in der ersten Zeile der Tabelle wird das Spieldatum ausgelesen. In der zweiten Zeile Uhrzeit, Heimmannschaft, Gastmannschaft, Ergebnis etc..

Nun möchte ich, dass alle Spiele mit dem gleichen Datum unter dem selben Tabellenkopf ausgegeben werden.

Beispiel:

Mannschaft a spielt gegen b am 01.01.06
Mannschaft c spielt gegen d am 01.01.06
Mannschaft e spielt gegen f am 02.01.06

Die Tabelle sollte dann so aussehen

01.01.06

a gegen b
c gegen d

02.01.06

e gegen f

Vielen Dank für eure Hilfe

gruß
Christian
 
Zuletzt bearbeitet:
mit
Group BY
fasse ich zwar die Datensätze zusammen aber es wird doch, soweit ich weiß, nur ein Datensatz dieser Gruppe ausgegeben. Oder
 
PHP:
$tmpDate = "";

while($row2 = mysql_fetch_object($sel2)) {

            if( $tmpDate != $row2->datum ) {
              $tmpDate = $row2->datum;
              echo "<tr><td colspan=\"8\">".$tmpDate."</td></tr>";
            }

            $d = explode("-", $row2->datum);
            if(isset($d[0]) AND isset($d[1]) AND isset($d[2])) {
                $datum = $d[2].".".$d[1].".".$d[0];
            }
            else { $datum = ""; }
            echo "
            
            <tr>
                <td colspan=\"8\" bgcolor=\"#FF0000\" align=\"left\"><font color=\"#FFFFFF \" face=\"Verdana \" style=\"font-size: 8pt \"><b>".$datum."</b></font></td>
            </tr>
            <tr>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->uhrzeit."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->heim."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">-</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->gast."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">(".$row2->mannschaft.")</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->egheim."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">:</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->eggast."</td>
            </tr>
            
            <tr>
                <td>&nbsp;</td>
            </tr>
            ";
        }

So ungefähr müßte das klappen :rolleyes:
Du überprüfst einfach nach jedem Schleifendurchlauf ob sich das Datum geändert hat.
Wenn ja, gibst du dieses geänderte Datum einfach einmal aus und gibst das nächste Datum auch dann erst wieder aus wenn sich dieses geändert hat.
Ich hoffe du verstehst was ich meine ;)

Gruß!
 
Zuletzt bearbeitet von einem Moderator:
Na ich weis ned ob Group By ned schon die Lösung ist ^^ hast de es mal ausprobiert?! wobei ich auch glaub das er nur einen Zusammengefassten wert ausgibt. Ansonsten hatte ichs chon eine Idee gehabt allerdings musst das meiste dan umschreiben. Und zwar das du immer den nächsten Datensatz in eine andere Variable speicherst so ca:

$row2 -> 1. Datensatz
$row3 -> 2. Datensatz

füge neue Zeile hinzu mit Spielbegegnung von $row2

if Datum von $row2 != Datum von $row3
{
füge noch eine neue Zeile hinzu mit Datum von $row3
und füge danach eine zeile hinzu mit Spielbegegnung von $row3
$row 2 kriegt wieder nächsten Datensatz
$row3 kriegt den darauf folgenden
}
Else
{
Kopiere Werte von $row3 nach $row2
und $row3 kriegt neuen Datensatz
}

Irgendwie so musst es dann halt nur bischen anpassen
 
Also ich habe das von TwoFaze mal ausprobiert, es kam ein Error das eine } an der flaschen Stelle sei. Nachdem ich sie entfernt hatte kam das:

Parse error: syntax error, unexpected T_VARIABLE, expecting ',' or ';' in /tpl/derspieltag.tpl on line 46

Ich verstehe so ungefähr was du meinst, aber gegen eine etwas genauere Erläuterung hätte ich nichts :).

Mit Group By werden die Datensätze zwar zusammengefasst, aber es wird nur ein Datensatz dieser Gruppe ausgegeben.
 
Zuletzt bearbeitet:
Sorry...mein Fehler :)
Füg hinter dem "echo"-Befehl in der If-Anweisung noch ein Semikolon ein, hab ich wohl irgendwie vergessen...
(Habe es oben korrigiert)

Gruß!
 
Ich habe noch etwas rumgebastelt und jetzt funktioniert es

So sieht der Code jetzt aus

PHP:
$tmpDate = "";

while($row2 = mysql_fetch_object($sel2)) {

		$d = explode("-", $row2->datum);
            if(isset($d[0]) AND isset($d[1]) AND isset($d[2])) {
                $datum = $d[2].".".$d[1].".".$d[0];
            }
            else { $datum = ""; }
		
            if( $tmpDate != $datum ) {
              $tmpDate = $datum;
              echo "
	      <tr>
                <td colspan=\"8\" bgcolor=\"#FF0000\" align=\"left\"><font color=\"#FFFFFF \" face=\"Verdana \" style=\"font-size: 8pt \"><b>".$tmpDate."</b></font></td>
            </tr>
	      ";
            }

            echo "
            
            <tr>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->uhrzeit."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->heim."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">-</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->gast."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">(".$row2->mannschaft.")</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->egheim."</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">:</td>
                <td bgcolor=\"#F4F4F4\" align=\"center\">".$row2->eggast."</td>
            </tr>
            
	   <tr>
                <td>&nbsp;</td>
            </tr>
	    
            ";
        }

Jetzt habe ich noch ein Problem, nach der Tabelle setzte ich noch eine leer Zeile hier:

PHP:
<tr>
                <td>&nbsp;</td>
            </tr>

Die soll aber nur kommen wenn ein Datum abgeschlossen ist. Also so

Datum
a gegen b
c gegen d

Leerzeile

Datum
e gegen f
g gegen h

Leerzeile

Wie frage ich das jetzt am besten und effizientesten ab?
 
In dem Bereich, wo das Datum ausgegeben wird, einfach noch die Leerzeile dazwischen schalten. Allerdings brauchst du noch eine Kontrollvariable, damit das nicht ganz am Anfang passiert...

PHP:
$kontroll = false;
while (/* */) {

// dein code, und vor der datumsausgabe:

if ($kontroll != false) echo "<tr><td>&nbsp;</td></Tr>";

// und am ende der schleife:

$kontroll = true;

}
 
Zurück