MySQL8.0.0マイルストーンリリースで述べたように利用可能です 、
これが、新しいバージョンのMySQLで観察されている動作の原因であると思います。前述のヒントをMySQL 8.0で使用すると、RAND()を1回だけ呼び出すことができます。
SELECT /* NO_MERGE(q) */
q.i,
q.r,
q.r
FROM (
SELECT
id AS i,
(FLOOR(RAND(100) * 4)) AS r
FROM t
) AS q;
+---+-----+-----+
| i | r | r |
+---+-----+-----+
| 1 | 0 | 0 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 2 | 2 |
| 5 | 1 | 1 |
+---+-----+-----+
ただし、これは5.7では使用できません。 5.7で目的の動作を実現するには、LIMIT <a very high number>
を追加します。 派生テーブル定義に(以下で署名されたLONG_MAXを使用しています)。この
SELECT
q.i,
q.r,
q.r
FROM (
SELECT
id AS i,
(FLOOR(RAND(100) * 4)) AS r
FROM t LIMIT 9223372036854775807
) AS q;
+---+-----+-----+
| i | r | r |
+---+-----+-----+
| 1 | 0 | 0 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 2 | 2 |
| 5 | 1 | 1 |
+---+-----+-----+
philipxyとして コメントで言及されているように、クエリ式の結果は、適用されている最適化に関係なく厳密に定義する必要があります。これは、MySQL 5.7/8.0のオプティマイザのバグであることを意味します。