Luise: Überschriften in einzelnen Bereichen einer SELECT Ausgabe aus einer Datenbank

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

  1. 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.

  2. 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
    1. 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.

      1. 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

        --
        sumpsi - posui - clusi
        1. 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

          --
          Pantoffeltierchen haben keine Hobbys.
          ¯\_(ツ)_/¯
    2. Danke für die Informationen, und das ausführlich Beispiel. Es hat mir sehr geholfen. Und ich verstehe es jetzt.