sql >> Databasteknik >  >> RDS >> Mysql

MySQL 5.7 RAND() och IF() utan LIMIT leder till oväntade resultat

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 eller 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




  1. Ta värde från FältA, skicka till db-funktion, returnera värde till FältB

  2. Hur upprätthåller man referensintegritet på enkelbordsarv?

  3. hibernate + mysql + ladda data i filen

  4. Serverns tidszonsvärde 'CEST' är okänt