Проблемът е причинен от промяна, въведена в MySQL 5.7 относно това как се третират извлечените таблици в (под)заявките.
По принцип, за да се оптимизира производителността, някои подзаявки се изпълняват по различно време и/или няколко пъти, което води до неочаквани резултати, когато вашата подзаявка връща недетерминирани резултати (като в моя случай с RAND()
).
Има две лесни (и по същия начин грозни) решения, за да накарате MySQL да „материализира“ (известни още като връщане на детерминирани резултати) тези подзаявки:Използвайте LIMIT <high number>
или GROUP BY id
и двете принуждават MySQL да материализира подзаявката и да връща очакваните резултати.
Последната опция е изключване на derived_merge
в optimizer_switch
променлива:derived_merge=off
(уверете се, че сте оставили всички останали параметри такива, каквито са).
Допълнителна информация:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Колоната rand() на подзаявката е преоценена за всеки повторен избор в MySQL 5.7/8.0 срещу MySQL 5.6