Problemet orsakas av en förändring införd i MySQL 5.7 om hur härledda tabeller i (under)frågor behandlas.
I grund och botten, för att optimera prestandan, exekveras vissa underfrågor vid olika tidpunkter och/eller flera gånger vilket leder till oväntade resultat när din underfråga returnerar icke-deterministiska resultat (som i mitt fall med RAND()
).
Det finns två enkla (och likaledes fula) lösningar för att få MySQL att "materialiseras" (alias returnera deterministiska resultat) dessa underfrågor:Använd LIMIT
GROUP BY id
båda tvingar MySQL att materialisera underfrågan och returnera de förväntade resultaten.
Det sista alternativet är att stänga av derived_merge
i optimizer_switch
variabel:derived_merge=off
(se till att lämna alla andra parametrar som de är).
Ytterligare läsningar:
https://mysqlserverteam.com/derived -tabeller-i-mysql-5-7/
Subquerys rand()-kolumn omvärderas för varje upprepat val i MySQL 5.7/8.0 vs MySQL 5.6