Auge: Distinct über Teil eines Feldes

Hallo

Das Thema (Select, Distinct über Teil eines Feldes) hatten wir ja in der letzten Woche schon mehrfach. Es wurde immer darauf hingewiesen, dass die Datenstruktur zu atomisieren sei.

Bei mir geht es darum, aus einer Tabelle mit Datumsangaben herauszulesen, ob es für einem Monat Einträge gibt. Das Datum (im Format JJJJ-MM-DD angegeben) weiter zu atomisieren ergibt keinen Sinn. Also versuche ich aus den gegebenen Daten das gewünschte herauszubekommen. Da ich in diesem Zusammenhang den Tag eines Eintrags nicht brauche, dachte ich mir, schneide ihn ab, so dass nur noch Angaben zu Jahr und Monat herauskommen (JJJJ-MM).

Mit SELECT DISTINCT DATE_FORMAT(startdatum,'%Y-%m') AS startdatum FROM tabelle ORDER BY startdatum ASC klappt das auch grundsätzlich. Allerdings bekomme ich für jeden Eintrag in der DB, der _nicht_ das gleiche _vollständige_ Datum wie ein anderer Eintrag trägt, einen Datensatz zurück. Ich brauche aber nur jeweils _einen_ Datensatz pro Monat.

Das könnte ich hernach über eine Filterung des Array per PHP (array_unique) erreichen. Ich würde es aber lieber dem DBMS (MySQL Version 5.0.27) überlassen, weiß aber nicht weiter. Die Umformatierung des Datums erfolgt ganz offensichtlich erst, nachdem Distinct nach mehreren Einträgen pro Datum gefiltert hat. Mir schwob dies andersherum vor, erst umformatieren (DATE_FORMAT()), dann filtern DISTINCT.

Geht das oder bin ich auf dem Holzweg?

Tschö, Auge

--
Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
(Victor Hugo)
Veranstaltungsdatenbank Vdb 0.2
  1. Hallo

    Mit SELECT DISTINCT DATE_FORMAT(startdatum,'%Y-%m') AS startdatum FROM tabelle ORDER BY startdatum ASC klappt das auch grundsätzlich. Allerdings bekomme ich für jeden Eintrag in der DB, der _nicht_ das gleiche _vollständige_ Datum wie ein anderer Eintrag trägt, einen Datensatz zurück. Ich brauche aber nur jeweils _einen_ Datensatz pro Monat.

    Nimm nicht DISTINCT, nimm GROUP BY, Du kannst in MySQL auch nach berechneten
    Spalten gruppieren.

    SELECT  
        DATE_FORMAT(t.startdatum, '%Y-%m') AS startdatum  
        -- in der Regel ist es keine gute Idee den Aliasnamen gleich einem  
        -- existierenden und verwendeten Spaltennamen zu wählen.  
    FROM  
        tabelle t  
    GROUP BY  
        DATE_FORMAT(t.startdatum, '%Y-%m')  
    ORDER BY  
        startdatum
    

    sollte es fürs erste tun.
    Übrigens könntest Du auch gleich die Einträge zählen :-)

    Freundliche Grüße

    Vinzenz

    1. Hallo

      Nimm nicht DISTINCT, nimm GROUP BY, Du kannst in MySQL auch nach berechneten
      Spalten gruppieren.

      SELECT

      DATE_FORMAT(t.startdatum, '%Y-%m') AS startdatum
          -- in der Regel ist es keine gute Idee den Aliasnamen gleich einem
          -- existierenden und verwendeten Spaltennamen zu wählen.
      FROM
          tabelle t
      GROUP BY
          DATE_FORMAT(t.startdatum, '%Y-%m')
      ORDER BY
          startdatum

      
      >   
      > sollte es fürs erste tun.  
        
      So ist es. Das Alias hab' ich gleich mitgeändert ...  
        
      
      > Übrigens könntest Du auch gleich die Einträge zählen :-)  
        
      ... und die (sowieso irgendwann schon einmal angedachte) Zählung hinzugefügt.  
        
      `SELECT DATE_FORMAT(t.startdate, '%Y-%m') AS startdatum, COUNT(t.id) as zaehler ...`{:.language-sql}  
        
      Einen herzlichen Dank für die Hilfe.  
        
      Tschö, Auge  
      
      -- 
      Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.  
      (Victor Hugo)  
        
      [Veranstaltungsdatenbank Vdb 0.2](http://termindbase.auge8472.de/)