Lösung ohne Verwendung von 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`
schau mal ob das geht. Es funktioniert gut mit stimulierten Daten. Sie können je nach Ihren Sortieranforderungen für vergangene und zukünftige Daten desc in asc ändern