Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL 5.7 RAND() und IF() ohne LIMIT führt zu unerwarteten Ergebnissen

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