Distinct über Teil eines Feldes
Auge
- datenbank
0 Vinzenz Mai0 Auge
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
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
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/)