Matthias Apsel: Ergebnisse gruppiert nach Monat ausgeben

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

--
Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Halle und Halleffekt.

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

    --
    Kleiner Tipp:
    Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
    1. 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

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Reif und Reifrock.

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

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

        --
        “All right, then, I'll go to hell.” – Huck Finn
      4. 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.
        
  2. 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

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

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

      --
      Kleiner Tipp:
      Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
      1. 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

        --
        ralphi