Mysql
 sql >> Database >  >> RDS >> Mysql

La colonna rand() della sottoquery è stata rivalutata per ogni selezione ripetuta in MySQL 5.7/8.0 rispetto a MySQL 5.6

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.