Rolf B: Überschriften in einzelnen Bereichen einer SELECT Ausgabe aus einer Datenbank

Beitrag lesen

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:

  • Vorbereitung
  • Aufgaben zum Beginn einer Gruppe
  • Aufgaben für jeden Satz in einer Gruppe
  • Aufgaben zum Ende einer Gruppe.
  • Nachbereitung

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

--
sumpsi - posui - clusi