Das Problem wird durch eine in MySQL 5.7 eingeführte Änderung verursacht, wie abgeleitete Tabellen in (Unter-)Abfragen behandelt werden.
Grundsätzlich werden zur Optimierung der Leistung einige Unterabfragen zu unterschiedlichen Zeiten und/oder mehrfach ausgeführt, was zu unerwarteten Ergebnissen führt Ergebnisse, wenn Ihre Unterabfrage nicht deterministische Ergebnisse zurückgibt (wie in meinem Fall mit RAND()
). ).
Es gibt zwei einfache (und gleichermaßen hässliche) Problemumgehungen, um MySQL dazu zu bringen, diese Unterabfragen zu „materialisieren“ (auch bekannt als deterministische Ergebnisse zurückzugeben):Verwenden Sie LIMIT <high number>
oder GROUP BY id
Beide zwingen MySQL, die Unterabfrage zu materialisieren und die erwarteten Ergebnisse zurückzugeben.
Die letzte Option ist derived_merge
auszuschalten im optimizer_switch
Variable:derived_merge=off
(achten Sie darauf, alle anderen Parameter so zu lassen, wie sie sind).
Weiterführende Literatur:
https://mysqlserverteam.com/derived -tabellen-in-mysql-5-7/
Spalte rand() der Unterabfrage neu ausgewertet für jede wiederholte Auswahl in MySQL 5.7/8.0 vs. MySQL 5.6