この問題は、MySQL 5.7で導入された(サブ)クエリの派生テーブルの処理方法の変更が原因で発生します。
基本的に、パフォーマンスを最適化するために、一部のサブクエリが異なる時間や複数回実行され、予期しない結果が発生します。サブクエリが非決定論的な結果を返したときの結果(私の場合はRAND()
)。
MySQLにこれらのサブクエリを「具体化」(つまり、決定論的な結果を返す)させるための2つの簡単な(そして同様に醜い)回避策があります。LIMIT <high number>
を使用します。 またはGROUP BY id
どちらもMySQLにサブクエリを実体化し、期待される結果を返すように強制します。
最後のオプションは、derived_merge
をオフにすることです。 optimizer_switch
で 変数:derived_merge=off
(他のすべてのパラメーターはそのままにしておいてください)。
詳細情報:
https://mysqlserverteam.com/duced -tables-in-mysql-5-7 /
MySQL 5.7 /8.0とMySQL5.6で繰り返し選択されるたびに、サブクエリのrand()列が再評価されました