Vous auriez besoin de dénormaliser un peu et de copier le champ posts.created_at dans la table post_tags (je l'ai appelé post_created_at, vous pouvez le nommer comme vous voulez) :
CREATE TABLE `posts_tags` (
`id` int(11) NOT NULL auto_increment,
`post_id` int(11) default NULL,
`tag_id` int(11) default NULL,
`post_created_at` datetime default NULL,
`created_at` datetime default NULL,
`updated_at` datetime default NULL,
PRIMARY KEY (`id`),
KEY `index_posts_tags_on_post_id_and_tag_id` (`post_id`,`tag_id`)
) ENGINE=InnoDB;
puis ajoutez un index à posts_tags sur
(tag_id, post_created_at)
Cela permettra à la requête d'obtenir tous les messages d'un tag, dans le bon ordre, sans tri de fichiers.