Problém je způsoben změnou zavedenou v MySQL 5.7 v tom, jak se zachází s odvozenými tabulkami v (pod)dotazech.
V zásadě se za účelem optimalizace výkonu některé poddotazy spouštějí v různých časech a/nebo vícekrát, což vede k neočekávaným výsledky, když váš poddotaz vrátí nedeterministické výsledky (jako v mém případě s RAND()
).
Existují dvě snadná (a také ošklivá) řešení, jak přimět MySQL k „materializaci“ (neboli návratu deterministických výsledků) těchto poddotazů:Použijte LIMIT <high number>
nebo GROUP BY id
oba nutí MySQL zhmotnit poddotaz a vrátit očekávané výsledky.
Poslední možností je vypnout derived_merge
v optimizer_switch
proměnná:derived_merge=off
(nezapomeňte ponechat všechny ostatní parametry tak, jak jsou).
Další informace:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Sloupec rand() poddotazu byl přehodnocen pro každý opakovaný výběr v MySQL 5.7/8.0 vs MySQL 5.6