Le problème est causé par un changement introduit dans MySQL 5.7 sur la façon dont les tables dérivées dans les (sous-)requêtes sont traitées.
Fondamentalement, afin d'optimiser les performances, certaines sous-requêtes sont exécutées à des moments différents et/ou à plusieurs reprises, ce qui entraîne des résultats lorsque votre sous-requête renvoie des résultats non déterministes (comme dans mon cas avec RAND()
).
Il existe deux solutions de contournement simples (et tout aussi moches) pour que MySQL "matérialise" (c'est-à-dire renvoie des résultats déterministes) ces sous-requêtes :utilisez LIMIT <high number>
ou GROUP BY id
qui forcent MySQL à matérialiser la sous-requête et à renvoyer les résultats attendus.
La dernière option est de désactiver derived_merge
dans le optimizer_switch
variable :derived_merge=off
(assurez-vous de laisser tous les autres paramètres tels quels).
Lectures complémentaires :
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
La colonne rand() de la sous-requête est réévaluée pour chaque sélection répétée dans MySQL 5.7/8.0 par rapport à MySQL 5.6