sql >> Base de Datos >  >> RDS >> Mysql

MySQL 5.7 RAND() y IF() sin LIMIT conduce a resultados inesperados

El problema se debe a un cambio introducido en MySQL 5.7 sobre cómo se tratan las tablas derivadas en las (sub)consultas.
Básicamente, para optimizar el rendimiento, algunas subconsultas se ejecutan en diferentes momentos y/o varias veces, lo que genera resultados inesperados. resultados cuando su subconsulta devuelve resultados no deterministas (como en mi caso con RAND() ).
Hay dos soluciones fáciles (y igualmente feas) para que MySQL "materialice" (es decir, devuelva resultados deterministas) estas subconsultas:Use LIMIT <high number> o GROUP BY id ambos obligan a MySQL a materializar la subconsulta y devolver los resultados esperados.
La última opción es desactivar derived_merge en el optimizer_switch variable:derived_merge=off (asegúrese de dejar todos los demás parámetros como están).

Lecturas adicionales:
https://mysqlserverteam.com/derived -tablas-en-mysql-5-7/
Columna rand() de Subquery reevaluada para cada selección repetida en MySQL 5.7/8.0 vs MySQL 5.6