Som nämnts i MySQL 8.0.0 Milestone Release är tillgänglig ,
Jag antar att detta är orsaken till beteendet jag observerar i nyare versioner av MySQL. Den nämnda tipsen kan användas med MySQL 8.0 för att tvinga RAND() att anropas endast en gång:
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 |
+---+-----+-----+
Detta är dock inte tillgängligt i 5.7. För att uppnå önskat beteende med 5.7, lägg till 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 som nämns i kommentaren måste resultatet av ett frågeuttryck vara strikt definierat oavsett om eventuella optimeringar tillämpas. Vilket betyder att det är en optimeringsbugg i MySQL 5.7/8.0.