Datenbankabfrage "geschickt" ausgeben

Alice

Erfahrenes Mitglied
Hallo.

Ich habe eine Tabelle die wie folgt aufgebau ist...

Code:
// Aufbau der Tabelle
ID / Reihenfolge / Vorname / Name / Beruf  / Bereich

Code:
// Typischer Inhalt
1 / 1 / Lisa / Süß / Bäckerin / Lebensmittel
2 / 2 / Martin / Reich / Pilot / Luftfahrt
3 / 3 / Marina / Hoffmann / Bürokauffrau / Kaufmännisch
4 / 4 / Peter / Lustig / Bäcker / Lebensmittel

Nun möchte ich die Einträge ausgeben, jedoch mit folgendem Unterschied.

Statt:
Code:
Lisa, Süß, Bäckerin
Martin, Reich, Pilot
Marina, Hoffmann, Bürokauffrau
Peter, Lustig, Bäcker

Soll es so ausgegeben werden:
Code:
Lebensmittel:
   Lisa, Süß, Bäckerin
   Peter, Lustig, Bäcker

Luftfahrt:
   Martin, Reich, Pilot

Kaufmännisch:
   Marina, Hoffmann, Bürokauffrau

Die Ausgabe muss Flexibel sein. Ich könnte die Bereiche natürlich auch "Hardcoded" direkt in den Quelltext schreiben, aber da die Bereiche nicht Starr sind, soll jedes mal nach "allen" und "neuen" Bereichen geprüft und mit ausgegeben werden.
 
Setz ein SQL ab, dass nach Bereich und dann nach Reihenfolge sortiert ist.
Am Anfang in der Schleife den Bereich mit dem letzten gespeicherten Bereich vergleichen. Ist er unterschiedlich, dann gib den Bereichtitel aus. Dann die Datenzeile und am Schluss den Bereich merken.


Pseudocode:
PHP:
$bereich = null;
while($data)
    if($data->bereich != $bereich){
        //TODO: Header ausgaben
    }
    //TOOD: Zeile ausgeben
    $bereich = $data->bereich;
}
 
Hallo.

Erst einmal vielen Dank für das Interesse und den PHP-Code.

Der Code läuft, zeigt jedoch über jedem Namen einen Header...

PHP:
   //TO-DO: Mitglieder-Tabelle auslesen
   $DB_Mitglieder = mysql_query("SELECT * FROM Mitglieder");

   $Bereiche = null;

   while ($Output_Mitglieder = mysql_fetch_array($DB_Mitglieder, MYSQL_ASSOC))
   {

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Header generieren
           echo "...";
           echo "...";
           echo "...";
       }

       //TO-DO: Mitglieder ausgeben
       echo "...";
       echo "...";
       echo "...";

   }

EDIT:

Ich sage nichts mehr... Ich habs. :)

Natürlich muss es so aussehen:
PHP:
   //TO-DO: Mitglieder-Tabelle auslesen
   $DB_Mitglieder = mysql_query("SELECT * FROM Mitglieder ORDER BY Bereich ASC, Position ASC");

   $Bereiche = null;

   while ($Output_Mitglieder = mysql_fetch_array($DB_Mitglieder, MYSQL_ASSOC))
   {

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Header generieren
           echo "...";
           echo "...";
           echo "...";
       }

       //TO-DO: Mitglieder ausgeben
       echo "...";
       echo "...";
       echo "...";

       //TO-DO: Bereich merken
       $Bereiche = Output_Mitglieder['Bereich'];
   }
 
Zuletzt bearbeitet:
Ich habe da doch noch ein kleines Problem.

Ich muss nach jedem Bereich ein Clear-Div mit einfügen.

Als Beispiel:
Code:
Lebensmittel
   Sandra Petra Heinz
   Udo Hakan

// Hier muss ein Clear-Div hin

Kaufmännisch
   Marina Yvonne

// Hier muss ein Clear-Div hin

Wie könnte ich das umsetzen? Die Mitglieder werden durch "float:left;" nebeneinander dargestellt.
 
Habe ich bereits ausprobiert, wenn ich Dich jetzt richtig verstanden habe. Geht leider nicht.

PHP:
   //TO-DO: Mitglieder-Tabelle auslesen
   $DB_Mitglieder = mysql_query("SELECT * FROM Mitglieder ORDER BY Bereich ASC, Position ASC");

   $Bereiche = null;

   while ($Output_Mitglieder = mysql_fetch_array($DB_Mitglieder, MYSQL_ASSOC))
   {

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Header generieren
           echo "...";
           echo "...";
           echo "...";
       }

       //TO-DO: Mitglieder ausgeben
       echo "...";
       echo "...";
       echo "...";

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Clear-Div einfügen
           echo "...";
           echo "...";
           echo "...";
       }

       //TO-DO: Bereich merken
       $Bereiche = Output_Mitglieder['Bereich'];
   }
 
Stimmt, gibt ja nur Punkte aus. Dort musst du natürlcih dein Clear-Div ausgeben.

Die Logik stimmt so. Ich sehe halt nicht was du da jetzt wirklich generierst, aber das Prinzip ist richtig.
 
... :D

Es soll erst der Bereich, dann die jeweiligen Mitglieder aus dem Bereich ausgegeben werden. Jedes Mitglied ist 1/3 der Webseitenbreite breit und floatet links. Also maximal drei Mitglieder pro Reihe. Wenn alle Mitglieder aus dem jeweiligen Bereich ausgegeben sind, soll der nächste Bereich (Header) + die Mitglieder ausgegeben werden. Bis hin funktioniert alles. :) Nun soll nach dem letzten Mitglied immer "gecleart" werden, um die Darstellung nicht zu zerstören.

PHP:
   //TO-DO: Mitglieder-Tabelle auslesen
   $DB_Mitglieder = mysql_query("SELECT * FROM Mitglieder ORDER BY Bereich ASC, Position ASC");

   $Bereiche = null;

   while ($Output_Mitglieder = mysql_fetch_array($DB_Mitglieder, MYSQL_ASSOC))
   {

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Header generieren
           echo "<div>\n";
           echo "   <div>\n";
           echo "      <span>\n";
           echo "         ".$Output_Mitglieder['Bereich']."\n";
           echo "      </span>\n";
           echo "   </div>\n";
           echo "</div>\n";
       }

       //TO-DO: Mitglieder ausgeben
       echo "<div style=\"float:left;width: 33.3%;\">\n";
       echo "   <div>\n";
       echo "      <img src=\"./img/".$Output_Mitglieder['Avatar']."\" />\n";
       echo "   </div>\n";
       echo "   <div>\n";
       echo "      <span>".$Output_Mitglieder['Name']."</span>\n";
       echo "      <br />\n";
       echo "      <span>".$Output_Mitglieder['Beruf']."</span>\n";
       echo "   </div>\n";
       echo "   <div style=\"clear:both;\"></div>\n";
       echo "</div>\n";

       if ($Output_Mitglieder['Bereich'] != $Bereiche)
       {
           //TO-DO: Clear-Div einfügen
           echo "<div style=\"clear:both;\"></div>\n";
       }

       //TO-DO: Bereich merken
       $Bereiche = Output_Mitglieder['Bereich'];
   }

Mit GENAU DIESEM Code geht es nicht sauber. Die Clear-Div´s sind dann nicht richtig platziert.

Die Funktion die ich benötige gibt es glaube ich nicht. Ich müsste in der While-Schleife anfragen können, welcher Bereich der nächste ist.

"Ist der nächste Bereich, nicht der selbe wie der aktuelle, dann füge ein Clear-Div ein."
 
Zuletzt bearbeitet:
Grmpf - stimmt. Das geht natürlich nicht so.

Mit ein wenig durch die Schleife denken geht das schon.

In deine Lösung integriert
PHP:
$Bereiche = null;
while ($Output_Mitglieder = mysql_fetch_array($DB_Mitglieder, MYSQL_ASSOC)){     
    if ($Output_Mitglieder['Bereich'] != $Bereiche){
        //prüfen obs es nicht der erste Bereich ist. Wenn nicht, den vorhergehenden schliessen
        if(!is_null($Bereiche)){
            //TODO: Div-Clear
        }
        //TO-DO: Header generieren
    } 
}
//Und am Schluss noch den letzten Bereich schliessen
//TODO: Div-Clear
 
Zurück