Zoals vermeld in The MySQL 8.0.0 Milestone Release is beschikbaar ,
Ik veronderstel dat dit de oorzaak is van het gedrag dat ik waarneem in nieuwere versies van MySQL. De genoemde hint kan worden gebruikt met MySQL 8.0 om te forceren dat RAND() slechts één keer wordt aangeroepen:
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 |
+---+-----+-----+
Dit is echter niet beschikbaar in 5.7. Om het gewenste gedrag met 5.7 te bereiken, voegt u LIMIT <a very high number>
toe naar de afgeleide tabeldefinitie (ik gebruik hieronder ondertekend LONG_MAX). Met dank aan Roy Lyseng voor deze oplossing
.
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 |
+---+-----+-----+
Als philipxy vermeld in de opmerking, moet het resultaat van een query-expressie strikt worden gedefinieerd, ongeacht eventuele optimalisaties die worden toegepast. Wat betekent dat het een optimalisatiefout is in MySQL 5.7/8.0.