Ausgabe aus MySQl gruppieren und in Liste ausgeben?
Hallo,
ich habe eine MySQL-Tabelle:
Ich will die Daten ausgeben und nach Datum und Fach gruppieren. Dies will ich dann als HTML-Liste ausgeben.
Mein bisheriger PHP-Code:
$sql = "SELECT * FROM `ha` WHERE `date` >= '$date' ORDER BY `ha`.`date` ASC, `ha`.`fach` ASC";
foreach ($pdo->query($sql) as $row) {
/*echo "<pre>";
print_r ( $row );
echo "</pre>";*/
echo '<ul>';
echo '<li>'.$row['date'].'<ul><li>'.$row['fach'].'<ul><li>'.$row['aufgabe'].'</li></ul></li></ul></li>';
echo '</ul>';
}
?>
Ausgabe:
Jetzt will ich die Ausgabe so verändern, dass diese Liste entsteht:
Hat jemand einen Code dafür bzw. Lösungsideen?
Vielen dank im voraus,
Caspar
Geht das vielleicht mit JavaScript besser?
3 Antworten
Da gibt es 2 Möglichkeiten:
- Du machst das in deinem PHP-Code, also du interpretierst deine Liste so, dass du bei jedem Element eine Prüfung einbaust, ob sich das Datum geändert hat.
- Du machst erst eine Anfrage in der Datenbank, welche Daten es gibt und fragst dann jedes einzeln ab. Das würde zu kleineren Anfragen führen und in einem gut indexierten Fall, die Datenbank weniger lange blockieren. Kürzere Blockade = Die Applikation kann mehr Anfragen bedienen, bei gleicher Hardware.
Einfacher ist 1.
Mein PHP ist arg eingerostet, HTML .. ich bin nicht mehr sicher ob ul oder li Liste oder Listenelement sind .. egal:
$sql = "SELECT * FROM `ha` WHERE `date` >= '$date' ORDER BY `ha`.`date` ASC, `ha`.`fach` ASC";
lastDate = NULL
echo '<ul>'; // Liste aller Daten
firstRun = true;
foreach ($pdo->query($sql) as $row) {
currentDate = $row['date']
if(lastDate != currentDate) {
if(!firstRun) echo '</ul>'; // Ende Liste des letzten Datumsblocks
firstrun = false;
echo '<li>'.$row['date'].'</li>';
echo '<ul>'; // Liste für diesen Datumsblock
}
echo '<li>'.##das Element, das in die Datumsliste soll.'</li>';
}
echo '</ul>'; // Ende: Liste des letzten Datums
echo '</ul>'; // Ende: Liste aller Daten
Es arbeitet zwar mit <div>, aber mit ein paar Anpassungen hatte ich auch eine Liste...
Das geht am ehesten innerhalb der while-Schleife indem Du prüfst, ob das Datum des Datensatzes ein anderes Datum als beim vorherigen Datensatz ist.
Hast du einen Code, weil ich kriege es irgendwie nicht hin?
Bisher ist mein Code:
$dateold = '';
$fachold = '';
echo '<ul>';
$sql = "SELECT * FROM `ha` WHERE `date` >= '$date' ORDER BY `ha`.`date` ASC, `ha`.`fach` ASC";
foreach ($pdo->query($sql) as $row) {
$date1 = 0;
$fach1 = 0;
if ($dateold !== $row['date']){
echo '<li>'.$row['date'];
$fachold = '';
$date1 = 1;
}
if ($fachold !== $row['fach']){
echo '<ul><li>'.$row['fach'];
$fach1 = 1;
}
echo '<ul> <li>'.$row['aufgabe'].'</li>';
if ($fach1 == 1){
echo '</ul></li></ul>';
}
if ($date1 == 1){
echo '</li>';
}
$dateold = $row['date'];
$fachold = $row['fach'];
$aufgabeold = $row['aufgabe'];
}
echo '</ul>';
?>
Lese dich in die Dynamik zwischen Group By und Heaving ein. Es ist komplex aber wenn du einmal ein grupiertes Ergebnis hast kannst du mit Heaving festlegen nach welchen weiteren Kriterien gruppiert werden soll.
Das funktioniert aber nur mit COUNT oder MAX, da kann ich mir ja nicht den gruppierten Wert ausgeben lassen oder?
Leider ist es eine Weile her als ich noch ABC Analysen in SQL programmieren musste.
Ich habe es jetzt so gelöst (Es ist nach für CSS was drin...):