Решение без използване на 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`
проверете дали това работи. Работи добре със стимулирани данни. Можете да промените desc на asc според вашите изисквания за сортиране за минали и бъдещи дати