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