Solution sans utiliser UNION/CASE
SELECT * FROM posts
ORDER BY
DATE(published_at)=DATE(NOW()) DESC,
DATE(published_at)<DATE(NOW()) DESC,
DATE(published_at)>DATE(NOW()) ASC`
vérifiez si cela fonctionne. Cela fonctionne bien avec des données stimulées. Vous pouvez changer desc en asc en fonction de vos exigences de tri pour les dates passées et futures