Anfängerfrage - MySQL Query
Moses
- datenbank
Hallo,
hier kommt sie mal wieder, die absolute Anfängerfrage 0-( , und nachdem mir auch kein gutes Schlagwort einfällt nachdem ich Suchen könnte, bitte nicht gleich mit Steinen werfen wenn sie schon hundertmal gestellt wurde.
Lese per PHP Datensätze aus eine MySQL Datenbank aus.
Diese möchte ich in einer Tabelle wiedergeben. Jetzt enthält aber jeder Datensatz eine Zuordnung, die bei der Bildschirmausgabe nur einmal angezeigt werden soll - als Überschrift. Wie mache ich das?
z.B. (ein blödes Beispiel aber ich denke es zeigt was ich will)
Datensatz 1:
Sommer 2003 - 12.07. - München - Treffen mit XYZ
Datensatz 2:
Sommer 2003 - 14.07. - Leipzig - Frei
Datensatz 3:
Herbst 2003 - 31.10. - Berlin - Halloween
etc.
Ausgabe sollte sein
Sommer 2003
12.07. München Treffen mit XYZ
14.07. Leipzig Frei
Herbst 2003
31.10. Berlin - Halloween
etc.
Habe schon Abfrage mit distinct versucht - allerdings habe ich da das Problem, daß ich den sql befehl anscheinend nicht richtig schreibe, denn entweder er sucht ausschließlich das mit distinct abgefragte Feld und ignoriert die weiteren Felder die abgefragt werden oder er gibt mir schlicht und ergreifend eine Fehlermeldung und macht gar nichts mehr (was weit häufiger vorkommt ;-).
Group By habe ich auch versucht, allerdings gibt er mir dann immer nur den ersten Datensatz der jeweiligen "Gruppe" an.
Habe bisher das Problem so gelöst, daß ich zuerst das eine Feld ausgewählt habe, gedruckt habe und dann eine neue Abfrage gestartet habe ala:
$sql =" select Jahreszeit from Kalender";
$erg = mysql_query($sql);
if (!$erg) die("<br>Abfrage nicht erfolgreich");
else {
while ($Aus = mysql_fetch_array($erg)) {
$viertel=$Aus["Jahreszeit"];
echo "$viertel";
$sqlz = "select Ort, Aktion from Kalender where Jahreszeit = $viertel";
$erg = mysql_query($sqlz);
if (!$erg) die("<br>Abfrage nicht erfolgreich");
else {
while ($Aus = mysql_fetch_array($erg)) {
echo "den Rest";
(das habe ich nur so runter geschrieben ohne es zu kontrolieren, also etwaige Fehler hier sind nicht der Verursacher des eigentlichen Problems!)
Aber das kann es ja wohl nicht sein, oder (besonders bei sehr umfangreichen und verknüpften Tabellen) ?
Danke für die Hilfe und beste Grüße,
Moses
Hallo!
Du könntest nach der Spalte "jahreszeit"(oder wie auch immer du das genannt hast) sortieren, also
SELECT FROM ... ORDER BY Jahreszeit
oder direkt nach Datum. So hättest Du das ganze wenigstens schonmal richtig sortiert. Wenn Du jetzt aber noch die Überschriften wie "Sommer 2003" anzeigen willst, udn ddas jeweils nur einmal, dann würde ich das wie folgt machen:
Da Du das ganze dann in einer Schleife mit while... ausgibst, könnntest Du ja nachdem Du nach Datum sortiert hast jeweils den Eintrag für die Jahreszeit in einer Variable speichern, udn immer wenn sich die verändert die neue Jahreszeit ausgeben, z.B. so:
$sql = "SELECT Jahreszeit, Ort, Aktion FROM Kalender ORDER BY Jahreszeit";
$erg = mysql_query($sql);
if (!$erg) {
die("<br>Abfrage nicht erfolgreich");
}
else {
while ($Aus = mysql_fetch_array($erg)) {
if ($viertel != $Aus["Jahreszeit"]) {
echo "$viertel";
}
$viertel = $Aus["Jahreszeit"];
echo "den Rest";
}
}
So was in der Art, wenn Du verstehst was ich meine!
Grüße
Andreas
Hallo,
das mit dem Sortieren war klar, aber die einfache Lösung mit der Variablen war ein klasse Tip - vielen Dank!.
Werde ich gleich mal ausprobieren.
Grüße,
Moses
Hallo @ All,
Du könntest nach der Spalte "jahreszeit"(oder wie auch immer du das genannt hast) sortieren, also
SELECT FROM ... ORDER BY Jahreszeit
oder direkt nach Datum. So hättest Du das ganze wenigstens schonmal richtig sortiert.
Man kann auch ohne Weiteres über zwei Spalten sortieren:
SELECT FROM ... ORDER BY Jahreszeit, Datum
Für den Fall das auf den Spalten auch Indexe [früher: Indices] liegen, optimiert MySQL die Abfrage sogar.
Wenn Du jetzt aber noch die Überschriften wie "Sommer 2003" anzeigen willst, udn ddas jeweils nur einmal, dann würde ich das wie folgt machen:
Da Du das ganze dann in einer Schleife mit while... ausgibst, könnntest Du ja nachdem Du nach Datum sortiert hast jeweils den Eintrag für die Jahreszeit in einer Variable speichern, udn immer wenn sich die verändert die neue Jahreszeit ausgeben, z.B. so:
$sql = "SELECT Jahreszeit, Ort, Datum, Aktion FROM Kalender ORDER BY Jahreszeit, Datum";
$erg = mysql_query($sql);
if (!$erg) {
die("<br>Abfrage nicht erfolgreich");
}
else {
$viertel=""; //Initialisierung nicht vergessen, auch
// wenn PHP das "eigentlich" selber macht!
while ($Aus = mysql_fetch_array($erg)) {
if ($viertel != $Aus["Jahreszeit"]) {
echo "$viertel";
}
$viertel = $Aus["Jahreszeit"];
echo "den Rest";
}
}
Grüße aus http://www-braunschweig.de
Tom
Hallo!
Man kann auch ohne Weiteres über zwei Spalten sortieren:
SELECT FROM ... ORDER BY Jahreszeit, Datum
ja, ich wollte es halt nicht verkomplizieren ;-)
$viertel=""; //Initialisierung nicht vergessen, auch
// wenn PHP das "eigentlich" selber macht!
warum soll ich das dann machen? Ich wollte erst schreiben unset($viertel) um zu verhindern dass was ind er Variable steht(genauso wie bei Dir), aber _das_ ist doch der einzige Grund, das initialisieren braucht man in PHP nun wirklich nicht, oder?
Grüße
Andreas
Hallo Andreas,
$viertel=""; //Initialisierung nicht vergessen, auch
// wenn PHP das "eigentlich" selber macht!
warum soll ich das dann machen? Ich wollte erst schreiben unset($viertel) um zu verhindern dass was ind er Variable steht(genauso wie bei Dir), aber _das_ ist doch der einzige Grund, das initialisieren braucht man in PHP nun wirklich nicht, oder?
doch, gerade aus dem Grunde der sauberen Staffelung von Scripten braucht man das. Mann könnte sich nämlich Module bauen und die mit include() oder require ineinander schachteln. Dann würden die globalen Variablen der Module automatisch auch in den nachfolgenden Teilen gelten, da ja letztendlich alles in einem Script steht.
Außerdem könnte ja ein Verrückter die Variable per GET an das Skript übergeben. Was ist dann, wenn die Globals eingeschaltet sind?
Gründe für sauberen Umgang mit Variablen gibts noch mehr...
Grüße aus http://www.braunschweig.de
Tom
Huhu Moses
eine einfache Lösung wäre z.B. folgende:
$LastHead = ''
while ($zeile = mysql_fetch_array($erg))
{
$CurrentHead = $zeile ['Überschrift'];
if ($CurrentHead != $LastHead) {
printf('<h1>%s</h1>',$CurrentHead );
$LastHead = $CurrentHead;
}
/*
some more output
*/
}
das obige Beispiel funktioniert aber nur, wenn die Datensätze
bereits nach Überschrift geordnet vorliegen.
Eine andere Möglichkeit wäre die Daten in Arrays zwischenzuspeichern.
Z.B. so
$haystack = array();
while ($zeile = mysql_fetch_array($erg))
{
$CurrentHead = $zeile ['Überschrift'];
$haystack[$CurrentHead][] = $zeile;
}
foreach ($haystack as $head => $all_lines )
{
printf('<h1>%s</h1>',$head );
foreach ($all_lines as $one_line){
printf ('<b>%s</b><br>' $one_line['Beschreibung']);
}
}
vielleicht kannst Du ja etwas davon "verbraten"
Viele Grüße
lulu
Hallo lulu,
vielen Dank für die ausführliche Hilfe - aber leider war das mit dem "Anfänger" ernst gemeint - irgendwie habe ich dich verloren ;-(
Also Datensätze sind nicht nach Überschrift geordnet (wußte gar nicht, daß das geht - werde ich in Zukunft wohl verwenden).
Eine andere Möglichkeit wäre die Daten in Arrays zwischenzuspeichern.
Z.B. so
$haystack = array();
while ($zeile = mysql_fetch_array($erg))
{
$CurrentHead = $zeile ['Überschrift'];
$haystack[$CurrentHead][] = $zeile;
}
foreach ($haystack as $head => $all_lines )
{
printf('<h1>%s</h1>',$head );
foreach ($all_lines as $one_line){
printf ('<b>%s</b><br>' $one_line['Beschreibung']);
}
}
vielleicht kannst Du ja etwas davon "verbraten"
Mein Hirn zumindest raucht schon - wird wohl noch ein bisschen dauern bis ich es checke......
Nochmals vielen Dank und liebe Grüße,
Moses
Viele Grüße
lulu
Hi Moses,
Jetzt enthält aber jeder Datensatz eine Zuordnung,
die bei der Bildschirmausgabe nur einmal angezeigt
werden soll - als Überschrift. Wie mache ich das?
versuche nicht, ein kaputtes Datenmodell durch ein kaputtes Anwendungsprogramm zu 'reparieren', sondern löse das Problem an der Wurzel: Passe Dein Datenmodell Deinen Anforderungen an.
Warum speicherst Du eine Information, die Du nur einmal brauchst, an vielen Stellen?
Was passiert, wenn diese Information an einer dieser vielen Stellen geändert wird?
Viele Grüße
Michael