sql >> Database >  >> RDS >> Mysql

MySQL 5.7 RAND() en IF() zonder LIMIT leiden tot onverwachte resultaten

Het probleem wordt veroorzaakt door een wijziging die is aangebracht in MySQL 5.7 in de manier waarop afgeleide tabellen in (sub)query's worden behandeld.
Om de prestaties te optimaliseren, worden sommige subquery's op verschillende tijdstippen en/of meerdere keren uitgevoerd, wat leidt tot onverwachte resultaten wanneer uw subquery niet-deterministische resultaten retourneert (zoals in mijn geval met RAND() ).
Er zijn twee gemakkelijke (en eveneens lelijke) oplossingen om MySQL deze subquery's te laten "materialiseren" (ook wel deterministische resultaten retourneren):Gebruik LIMIT <high number> of GROUP BY id beide dwingen MySQL om de subquery te realiseren en de verwachte resultaten te retourneren.
De laatste optie is het uitschakelen van derived_merge in de optimizer_switch variabele:derived_merge=off (zorg ervoor dat u alle andere parameters laat zoals ze zijn).

Verdere lezingen:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Subquery's kolom rand() opnieuw geëvalueerd voor elke herhaalde selectie in MySQL 5.7/8.0 versus MySQL 5.6




  1. Een databasemodel ontwerpen voor een bioscoopreserveringssysteem

  2. Hoe vind je de meest populaire woordvoorvallen in MySQL?

  3. Kolom wijzigen versus kolom wijzigen

  4. Laravel - Querymodel als waarden een bepaalde tekenreeks bevatten (overgenomen uit zoekinvoer)