Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL 5.7 RAND() dan IF() tanpa LIMIT menghasilkan hasil yang tidak terduga

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Pesan berdasarkan kolom =x, kolom asc?

  2. Hanya tampilkan tanggal terbaru dari tabel MySQL yang bergabung

  3. Bagaimana cara membuat model Django dengan ForeignKeys yang tidak menghapus secara kaskade ke anak-anaknya?

  4. Bagaimana cara mengimplementasikan kueri mySQL ini dengan benar ke dalam file PHP dan menampilkan hasilnya?

  5. Kesalahan MySql:Tidak dapat memperbarui tabel dalam fungsi/pemicu yang disimpan