Jak je uvedeno v Vydání MySQL 8.0.0 Milestone je k dispozici ,
Předpokládám, že toto je příčina chování, které pozoruji v novějších verzích MySQL. Uvedenou nápovědu lze použít s MySQL 8.0 k vynucení volání RAND() pouze jednou:
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 |
+---+-----+-----+
To však není k dispozici v 5.7. Chcete-li dosáhnout požadovaného chování s 5.7, přidejte LIMIT <a very high number>
na odvozenou definici tabulky (níže používám podepsané LONG_MAX). Děkujeme Royi Lysengovi za toto řešení
.
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 |
+---+-----+-----+
Jako philipxy Jak je uvedeno v komentáři, výsledek dotazového výrazu musí být přesně definován bez ohledu na jakékoli použité optimalizace. Což znamená, že jde o chybu optimalizátoru v MySQL 5.7/8.0.