Řešení bez použití 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`
zkontrolujte, zda to funguje. Funguje dobře se stimulovanými daty. Desc můžete změnit na vzestupné podle vašich požadavků na řazení pro minulá a budoucí data