Vấn đề là do một thay đổi được giới thiệu trong MySQL 5.7 về cách xử lý các bảng dẫn xuất trong các truy vấn (con).
Về cơ bản, để tối ưu hóa hiệu suất, một số truy vấn con được thực thi vào các thời điểm khác nhau và / hoặc nhiều lần dẫn đến không mong muốn kết quả khi truy vấn con của bạn trả về kết quả không xác định (như trong trường hợp của tôi với RAND()
).
Có hai cách giải quyết dễ dàng (và tương tự là xấu) để MySQL "hiện thực hóa" (hay còn gọi là trả về kết quả xác định) các truy vấn con này:Sử dụng LIMIT <high number>
hoặc GROUP BY id
cả hai đều buộc MySQL hiện thực hóa truy vấn con và trả về kết quả mong đợi.
Tùy chọn cuối cùng là tắt derived_merge
trong optimizer_switch
biến:derived_merge=off
(đảm bảo giữ nguyên tất cả các thông số khác).
Các bài đọc thêm:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7 /
Cột rand () của truy vấn con được đánh giá lại cho mọi lựa chọn lặp lại trong MySQL 5.7 / 8.0 so với MySQL 5.6