Hallo SQL-Experten, ich habe eine mysql-Tabelle mit Personendaten, darunter die Geburtsdaten. Nun möchte ich per php eine "Alters"-Tabelle erzeugen, in der nur das Alter der Personen aufgeführt wird, und zwar nur einmal. Das wollte ich mit DISTINCT lösen. Die Altersberechnung funktioniert, aber DISTINCT funktioniert nicht, es werden alle Zeilen doppelt und dreifach ausgelesen.
Mein Code sieht so aus:
"SELECT DISTINCT TIMESTAMPDIFF(YEAR, geburtsdatum, NOW()) AS alter_jahr FROM Tabelle"
Also statt:
15 Jahre 17 Jahre 20 Jahre 21 Jahre 30 Jahre 32 Jahre kommt das dabei raus: 15 Jahre 15 Jahre 17 Jahre 20 Jahre 20 Jahre 20 Jahre ... usw.
----------------------------------------------
Edit:
NOW() kann wohl wegen der sich ständig ändernden Uhrzeit nicht mit DISTINCT funktionieren ;-)
Mit CURDATE() funktioniert das ganze jetzt :-)
Jetzt ergibt sich aber ein anderes Problem: Es existieren auch verstorbene Personen in der Tabelle. Damit deren Alter nicht bis CURDATE() berechnet wird, sondern bis zum Feld "todesdatum", habe ich eine UNION-Abfrage gemacht, wobei ich einmal nach den noch lebenden und einmal nach den schon verstorbenen suche. Das klappt auch. Aber die Sortierung nicht, es ist ein heilloses Kuddelmuddel. ORDER BY scheint nicht zu funktionieren.
Hier ist mein Code:
(SELECT DISTINCT TIMESTAMPDIFF(YEAR, geburtsdatum, todesdatum) AS alter_jahr FROM Tabelle WHERE todesdatum NOT LIKE '0000-00-00') UNION (SELECT DISTINCT TIMESTAMPDIFF(YEAR, geburtsdatum, CURDATE()) AS alter_jahr FROM Tabelle WHERE todesdatum LIKE '0000-00-00')
Edit:
ORDER BY funktioniert, wenn ich bei der UNION-Abfrage die äußeren Klammern weglasse, also folgendermaßen:
SELECT DISTINCT TIMESTAMPDIFF(YEAR, geburtsdatum, todesdatum) AS alter_jahr FROM Tabelle WHERE todesdatum NOT LIKE '0000-00-00' UNION SELECT DISTINCT TIMESTAMPDIFF(YEAR, geburtsdatum, CURDATE()) AS alter_jahr FROM Tabelle WHERE todesdatum LIKE '0000-00-00' ORDER BY alter_jahr"
Problem damit gelöst :-)
Andreas