Ergebnisse gruppiert nach Monat ausgeben
Matthias Apsel
- datenbank
0 ichbinich0 Matthias Apsel1 T-Rex1 ichbinich1 1UnitedPower2 dedlfix
0 ralphi
Om nah hoo pez nyeetz, alle!
Ich habe Datensätze, die ein Datumsfeld enthalten und möchte diese gruppiert nach Monaten ausgeben. Wie stell ich das am geschicktesten an?
Also zuerst alle Ergebnisse mit einem Datumsfeld "2014-11-...", dann "2014-10-...", wobei die Datumsfelder keine Konstanten sind, sondern regelmäßig Einträge hinzukommen und auch welche gelöscht werden.
Ich könnte natürlich mit PHP alle Datumsfelder anschauen, daraus die Monate generieren und dann die Ausgabe erstellen, aber vielleicht lässt sich auf Datenbankebene schon vorsortieren?
Matthias
Hallo,
Ich habe Datensätze, die ein Datumsfeld enthalten und möchte diese gruppiert nach Monaten ausgeben. Wie stell ich das am geschicktesten an?
Also wenn ich dich richtig verstehe suchst du ORDER BY MONTH(date_column) DESC
?
vg ichbinich
Om nah hoo pez nyeetz, ichbinich!
Also wenn ich dich richtig verstehe suchst du
ORDER BY MONTH(date_column) DESC
?
Das Sortieren funktioniert ja auch nur mit ORDER BY date_column DESC
. Am Ende soll die Ausgabe so aussehen
<h3>Oktober 2014</h3>
Einträge mit entsprechendem Datum
<h3>September 2014</h3>
Einträge mit entsprechendem Datum
Matthias
Das Sortieren funktioniert ja auch nur mit
ORDER BY date_column DESC
. Am Ende soll die Ausgabe so aussehen
Entweder schickst du mehrere SQL Befehle ab (wobei du das MONTH(date_column) auch als Where Bedingung verwenden kannst) oder du gehst das komplette und bereits vorsortierte Ergebnis mit PHP durch.
Mehr Möglichkeiten sehe ich da nicht.
Als kleine Hilfe könntest du dir MONTH(date_column) als extra Spalte ausgeben lassen, dann tust du dich beim mit PHP durchgehen ein wenig leichter.
Gruß
Two Face Rex
Hallo,
Das Sortieren funktioniert ja auch nur mit
ORDER BY date_column DESC
. Am Ende soll die Ausgabe so aussehen
<h3>Oktober 2014</h3>
Einträge mit entsprechendem Datum
<h3>September 2014</h3>
Einträge mit entsprechendem Datum
Na dann hast du ja die Daten schon so sortiert, wie du sie brauchst. Was willst du denn noch mehr sortieren? Mehr geht ja nicht.
Um es dir in PHP noch zu vereinfachen, könntest du höchstens in der Datenbank zusätzlich zum Datum noch den Monat separat selektieren. Ob das aber so viel bringt...
vg ichbinich
--
Kleiner Tipp:
Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
Hakuna matata!
<h3>Oktober 2014</h3>
Einträge mit entsprechendem Datum
<h3>September 2014</h3>
Einträge mit entsprechendem Datum
Das musst du mit PHP machen, MySQL-Ergebnismengen bestehen immer nur aus Zeilen und Spalten, andere Strukutren, wie gruppierte Mengen, sind nicht möglich.
Das scheint mir ein ziemlich häufiger Fall zu sein, ich benutze dafür immer etwas in dieser Art:
~~~php
$groupedRows = array_reduce( $rows, function ( &$accumulator, $row ) {
if ( ! isset( $accumulator[ $row->month ] ) ) {
$accumulator[ $row->month ] = array();
}
$accumulator[ $row->month ] = $row;
return $accumulator;
}, array());
$groupedRows
ist dann ein mehrdimensionales Array, das auf erster Ebene die Monate enthält und auf zweiter Ebene die entsprechenden Zeilen.
Tach!
Das Sortieren funktioniert ja auch nur mit
ORDER BY date_column DESC
. Am Ende soll die Ausgabe so aussehen
<h3>Oktober 2014</h3>
Einträge mit entsprechendem Datum
<h3>September 2014</h3>
Einträge mit entsprechendem Datum
Was du suchst nennt sich Gruppenwechsel. Den macht man in der abfragenden Programmiersprache.
dedlfix.
Hi Matthias,
hab ich nicht auch schon mal die Frage gestellt? :-)
Nun - meine Lösung war/ist eine weitere Spalte 'Monat' einzufügen.
Und direkt beim Insert/Update mit zu füllen.
Die alten Datensätze natürlich mit UPDATE PHP script zu aktuallisieren.
Viele Grüße aus LA
Hi Matthias,
es gab auch eine Lösung im Forum (ich find sie nicht mehr), weiß auch nicht mehr von wem es war, mit einer art 'instring' im SQL.
hab doch mal dr google bemüht:
$sql = "SELECT * FROM events ORDER BY MONTH(datum);";
$res = mysql_query( $sql);
while ($row = mysql_fetch_array($res)){
echo $row['datum'] . "<br>\n";
}
klappt unter MySQL wunderbar
1970-01-01
2013-01-01
2014-01-25
2013-02-25
2013-03-11
2013-03-15
Viele Grüße aus LA
Hallo,
Nun - meine Lösung war/ist eine weitere Spalte 'Monat' einzufügen.
Und direkt beim Insert/Update mit zu füllen.
Damit hast du dann redundante Daten. Den Monat kannst du bei der Abfrage aus dem Datum ermitteln und musst ihn nicht zusätzlich speichern.
vg ichbinich
Hi,
Damit hast du dann redundante Daten. Den Monat kannst du bei der Abfrage aus dem Datum ermitteln und musst ihn nicht zusätzlich speichern.
nicht im negativen Sinn, wie zwei Tabellen mit gleichen Daten.
Es ist durchaus üblich nicht nur den timestamp mit time() als Spalte in dem selben Datensatz anzulegen, sondern auch Datum, Uhrzeit, KW etc.
meistens ist das mehr an Speichernutzung der DB, gegenüber dem Geschwindigkeitsverlust von mehrfachen date() Funktionsaufrufen zum Rechnen des Datum, KW etc besser.
Find ich ;-)
Viele Grüße aus LA