Vous n'êtes pas proche de la limite de JOIN pour MySQL. Votre nombre de jointures n'est pas mauvais. Cependant, joindre une table dérivée (votre sous-requête interne) comme vous le faites peut entraîner des problèmes de performances, car les tables dérivées n'ont pas d'index. L'exécution d'une jointure sur une table dérivée sans index peut être lente.
Vous devriez envisager de créer une vraie table temporaire avec des index pour la jointure, ou trouver un moyen d'éviter la sous-requête.
Un JOIN dans MySQL revient à faire une recherche (recherche) pour chaque ligne jointe. Ainsi, MySQL devra effectuer de nombreuses recherches si vous joignez de nombreux enregistrements. C'est moins le nombre de tables que vous rejoignez que le nombre de lignes que vous rejoignez qui peut être un problème.
Quoi qu'il en soit, MySQL n'effectuera qu'un certain nombre de recherches avant d'abandonner et de lire la table entière. Il fait un très bon travail pour décider lequel sera le moins cher.
Peut-être que la meilleure chose que vous puissiez faire est de l'aider à deviner en mettant à jour les statistiques de l'index avec ANALYZE TABLE.
Vous pouvez avoir une clause WHERE par SELECT. Ainsi, votre sous-requête interne aura une clause WHERE et votre requête externe aura une clause WHERE, et celles-ci seront appliquées après le JOIN (au moins logiquement, bien que MySQL les appliquera généralement en premier pour les performances).
De plus, tout cela suppose que vous savez comment utiliser correctement les index.