Je ne connais pas le code-igniter, mais en gros, vous voulez qu'il fasse d'abord l'union, puis applique l'ordre par sur l'ensemble de l'ensemble. Cela nécessiterait une sous-requête. Cela devrait aboutir à la requête SQL suivante :
select * from
((SELECT * FROM media m INNER JOIN category c ON m.category_id = c.id )
UNION ALL
(SELECT * FROM media m INNER JOIN category c ON m.category_id = c.id)) T
ORDER BY m.media_files DESC LIMIT 3
J'espère que cela vous aidera un peu.