Überschriften in einzelnen Bereichen einer SELECT Ausgabe aus einer Datenbank
Luise
- datenbank
- mysql
0 Felix Riesterer0 Rolf B0 dedlfix0 Rolf B
0 Luise- danke
Hallo, ich stehe vor einer Aufgabe in MYSQL die ich versuche zu beschreiben Ich erstelle aus einer Tabelle alle relevanten Informationen, aus der zweiten Tabelle die Namen der Kategorien. Die Daten sortiere ich nach den Namen der Kategorien.
SELECT a.*, b.titel AS kategorie FROM table1 a
LEFT JOIN table2 b ON a.cat = b.id
ORDER BY b.titel ASC
Alle Daten geben ich anschließend in einer while Schleife aus.
München Stadt
Hamburg Stadt
Bielefeld Stadt
England Land
Deutschland Land
Ich würde die Ausgabe gerne so haben, das der Titel der Kategorie nur einmal genannt wird
--------------
Stadt
--------------
München
Hamburg
Bielefeld
--------------
Land
--------------
England
Deutschland
Luise
Liebe(r) Luise,
Alle Daten geben ich anschließend in einer while Schleife aus.
was für eine while
-Schleife? In MySQL? Und was meinst Du mit "ausgeben" genau? Das von MySQL gelieferte Ergebnis?
Liebe Grüße,
Felix Riesterer.
Hallo Luise,
kleine Spitze vorweg: "Stadt", "Land" ist aber nicht ORDER BY b.titel ASC
Wenn Du eine Sortierung nach geographischer Größe der Kategorie haben willst, wirst Du in table2 eine weitere Spalte brauchen, die diese geographische Größe beschreibt und wonach Du dann sortierst (z.B. Straße=1, Stadt=2, Bundesstaat=3, Provinz=3, Statt=4, Kontinent=5 - keine Ahnung, so wie du es für Dich brauchst eben).
Was Du mit deinen Überschriften haben willst, ist eine altehrwürdige Programmieraufgabe: der Gruppenwechsel. Diese Aufgabe ist zu Opas und Papas Zeiten (also zu meiner Jugendzeit) so häufig gewesen, dass es dazu sogar eine Norm gibt: DIN 66220.
Problemstellung: Du hast eine Menge von Datensätzen, und in diesen Datensätzen gibt es ein Gruppiermerkmal. Die Datensätze liegen nach dem Gruppiermerkmal aufsteigend sortiert vor. Du hast nun mehrere Teilbereiche in deinem Programm:
Je nach verwendeter Programmiersprache implementiert man das unterschiedlich. Der "genormte" Ansatz mit Vorauslesen und Nachlesen sieht so aus:
Lies den ersten Satz (in PHP zum Beispiel `fetch_assoc` auf einem `mysqli_result`)
WHILE (ein Satz ist da)
Speichere das Gruppierungsmerkmal des aktuellen Satzes (bei Dir: die Kategorie)
Beginne eine Gruppe mit dem aktuellen Gruppierungsmerkmal
WHILE (ein Satz ist da und hat dieses Gruppierungsmerkmal)
Verarbeite den Satz
Lies den nächsten Satz
END-WHILE
Beende die Gruppe
END-WHILE
"Beende die Gruppe" würde bei Dir entfallen. "Beginne eine Gruppe" würde bedeuten, eine Zeile mit "------------" auszugeben, dann die Kategorie, dann nochmal "------------".
Die kreative Leistung an diesem Entwurf ist, dass Du zwei Schleifen hat (eine für die Gruppen, darin eine für die Sätze), und dass Du einen Satz vorausliest.
Letztlich keine Raketenwissenschaft, das hat schon Grace Hopper gekonnt. Der Schritt zur Raketenwissenschaft kommt, wenn Du zwei oder mehr Dateien zusammenführen musst, die mehrstufig gruppiert sind...
Wenn man alle Sätze schon in einem Array hat (z.B. in PHP durch mysqli_fetch_all), dann kann man diese genormte Logik vereinfachen und mit nur einer Schleife auskommen. Der folgende Code ist PHP mit Simpel-HTML Ausgabe:
$rows = $result->fetch_all(MYSQLI_ASSOC);
$kategorie = null;
foreach ($rows as $row)
{
if ($row['kategorie'] != $kategorie)
{
$kategorie = $row['kategorie'];
echo "<br>-----------";
echo "<br>$kategorie";
echo "<br>-----------";
}
echo "<br>$row[name]"; // Unter der Annahme, dass diese Spalte so heißt
}
Natürlich kann man auch auf ein Array die Normlogik anwenden und das Setzen des Arrayindex als Vorauslesen oder Nachlesen bezeichnen.
Rolf
Tach!
Was Du mit deinen Überschriften haben willst, ist eine altehrwürdige Programmieraufgabe: der Gruppenwechsel. Diese Aufgabe ist zu Opas und Papas Zeiten (also zu meiner Jugendzeit) so häufig gewesen, dass es dazu sogar eine Norm gibt: DIN 66220.
Die wurde auch im Self-Raum so häufig behandelt, dass es dazu einen Wiki-Artikel gibt.
dedlfix.
Hallo dedlfix,
oh. Zu meiner - vergleichsweise kurzen - Zeit hier nicht. Diesen Artikel hätte ich jetzt nicht erwartet.
Und es ist sogar ein Remake des Nassi-Shneiderman Diagramms aus der Wikipedia darin :) Reicht es, die Quell-Nennung auf der Bildseite durchzuführen?
Rolf
Hallo Rolf B,
Und es ist sogar ein Remake des Nassi-Shneiderman Diagramms aus der Wikipedia darin :) Reicht es, die Quell-Nennung auf der Bildseite durchzuführen?
Ich meine ja.
Bis demnächst
Matthias
Danke für die Informationen, und das ausführlich Beispiel. Es hat mir sehr geholfen. Und ich verstehe es jetzt.