Hello,
SELECT
posts.*,
GROUP BY
posts.id
du hast zwar mittlerweile eine funktionierende Lösung gefunden, aber ich möchte dich dennoch darauf hinweisen, dass du eine hohe Toleranz von MySQL ausnutzt. Der SQL Standard sieht eigentlich vor, dass man innerhalb einer Gruppierung nur zwei Arten von Spalten abfragen darf:
- solche, nach denen gruppiert wurde (hier: posts.id)
- solche, die durch eine Aggregation oder vergleichbare Funktion entstanden sind (COUNT, MAX, AVG, ...)
Deine posts.* (davon mal abgesehen, dass * nur zu Testzwecken verwendet werden sollte) ergibt aber mehr Spalten - MySQL ist das einzige mir bekannte DBMS, dass dir dies durchgehen lässt. Die Frage ist nämlich die: Welches konkrete Post soll ich denn ausliefern? In deinem Fall magst du argumentieren "moment, ich gruppiere doch nach dem Primärschlüssel, da kommt ja nur ein einziges raus" - sauber ist es trotzdem nicht. Aber alleine aus diesem Argument lässt sich auch die saubere Schreibweise dieser Abfrage ableiten:
SELECT
posts.id, posts.titel, ...
count(comments.id) as comments
FROM
`posts`
LEFT JOIN
`comments` ON comments.post_id = posts.id
GROUP BY
posts.id, posts.titel, ...
MfG
Rouven
-------------------
Death is nature's way of telling you to slow down.