Masalah ini disebabkan oleh perubahan yang diperkenalkan di MySQL 5.7 tentang bagaimana tabel turunan di (sub)query diperlakukan.
Pada dasarnya, untuk mengoptimalkan kinerja, beberapa subquery dieksekusi pada waktu yang berbeda dan/atau beberapa kali yang mengarah ke hal yang tidak terduga hasil ketika subquery Anda mengembalikan hasil non-deterministik (seperti dalam kasus saya dengan RAND()
).
Ada dua solusi mudah (dan juga jelek) untuk membuat MySQL "terwujud" (alias mengembalikan hasil deterministik) subkueri ini:Gunakan LIMIT <high number>
atau GROUP BY id
keduanya memaksa MySQL untuk mewujudkan subquery dan mengembalikan hasil yang diharapkan.
Opsi terakhir adalah mematikan derived_merge
di optimizer_switch
variabel:derived_merge=off
(pastikan untuk membiarkan semua parameter lainnya apa adanya).
Bacaan lebih lanjut:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Kolom rand() subquery dievaluasi ulang untuk setiap pemilihan berulang di MySQL 5.7/8.0 vs MySQL 5.6