Come menzionato in La versione Milestone di MySQL 8.0.0 è disponibile ,
Suppongo che questa sia la causa del comportamento che sto osservando nelle versioni più recenti di MySQL. Il suggerimento menzionato può essere utilizzato con MySQL 8.0 per forzare la chiamata RAND() solo una volta:
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 |
+---+-----+-----+
Questo tuttavia non è disponibile in 5.7. Per ottenere il comportamento desiderato con 5.7, aggiungi LIMIT <a very high number>
alla definizione della tabella derivata (sto usando firmato LONG_MAX di seguito). Grazie a Roy Lyseng per questa soluzione alternativa
.
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 |
+---+-----+-----+
Come filippia menzionato nel commento, il risultato di un'espressione di query deve essere rigorosamente definito indipendentemente dalle ottimizzazioni applicate. Ciò significa che è un bug dell'ottimizzatore in MySQL 5.7/8.0.