O problema é causado por uma mudança introduzida no MySQL 5.7 sobre como as tabelas derivadas em (sub)consultas são tratadas.
Basicamente, para otimizar o desempenho, algumas subconsultas são executadas em momentos diferentes e/ou várias vezes levando a resultados inesperados. resultados quando sua subconsulta retorna resultados não determinísticos (como no meu caso com
RAND()
).Existem duas soluções fáceis (e igualmente feias) para fazer o MySQL "materializar" (também conhecido como retornar resultados determinísticos) essas subconsultas:Use
LIMIT <high number>
ou GROUP BY id
ambos forçam o MySQL a materializar a subconsulta e retornar os resultados esperados.A última opção é desativar
derived_merge
no optimizer_switch
variável:derived_merge=off
(certifique-se de deixar todos os outros parâmetros como estão). Outras leituras:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Coluna rand() da subconsulta reavaliada para cada seleção repetida no MySQL 5.7/8.0 vs MySQL 5.6