Som nævnt i MySQL 8.0.0 Milestone Release er tilgængelig ,
Jeg formoder, at dette er årsagen til den adfærd, jeg observerer i nyere versioner af MySQL. Det nævnte tip kan bruges med MySQL 8.0 for at tvinge RAND() til kun at blive kaldt én gang:
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 |
+---+-----+-----+
Dette er dog ikke tilgængeligt i 5.7. For at opnå den ønskede adfærd med 5.7 skal du tilføje LIMIT
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 |
+---+-----+-----+
Som philipxy nævnt i kommentaren, skal resultatet af et forespørgselsudtryk være strengt defineret, uanset om der anvendes optimeringer. Hvilket betyder, at det er en optimeringsfejl i MySQL 5.7/8.0.