Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL 5.7 RAND() i IF() bez LIMIT prowadzi do nieoczekiwanych wyników

Problem jest spowodowany zmianą wprowadzoną w MySQL 5.7 dotyczącą sposobu traktowania tabel pochodnych w (pod)zapytaniach.
Zasadniczo, aby zoptymalizować wydajność, niektóre podzapytania są wykonywane w różnym czasie i/lub wielokrotnie, co prowadzi do nieoczekiwanych wyniki, gdy twoje podzapytanie zwraca niedeterministyczne wyniki (jak w moim przypadku z RAND() ).
Istnieją dwa proste (i równie brzydkie) obejścia, dzięki którym MySQL „zmaterializuje” (czyli zwraca deterministyczne wyniki) tych podzapytań:Użyj LIMIT <high number> lub GROUP BY id obie zmuszają MySQL do zmaterializowania podzapytania i zwrócenia oczekiwanych wyników.
Ostatnią opcją jest wyłączenie derived_merge w optimizer_switch zmienna:derived_merge=off (należy pozostawić wszystkie inne parametry bez zmian).

Dalsze lektury:
https://mysqlserverteam.com/derived -tabele-w-mysql-5-7/
Kolumna rand() podzapytania jest ponownie oceniana dla każdego powtórzonego wyboru w MySQL 5.7/8.0 w porównaniu z MySQL 5.6




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaktualizować tabelę przestawną za pomocą Eloquent w laravel 5

  2. Jaki jest najlepszy sposób na uniknięcie danych wprowadzanych przez użytkownika dla wyrażeń regularnych w MySQL?

  3. Potrzebuję nietypowych wyników zamawiania mysql

  4. Odbicie SQLAlchemy:Jak wykonać zapytanie o dane z określonych kolumn?

  5. ORDER BY data z datami przeszłymi po datach nadchodzących