Wie in The MySQL 8.0.0 Milestone Release erwähnt ist verfügbar ,
Ich nehme an, dass dies die Ursache für das Verhalten ist, das ich in neueren Versionen von MySQL beobachte. Der erwähnte Hinweis kann mit MySQL 8.0 verwendet werden, um zu erzwingen, dass RAND() nur einmal aufgerufen wird:
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 |
+---+-----+-----+
Dies ist jedoch in 5.7 nicht verfügbar. Um das gewünschte Verhalten mit 5.7 zu erreichen, fügen Sie LIMIT <a very high number>
hinzu zur abgeleiteten Tabellendefinition (ich verwende unten signiertes LONG_MAX). Danke an Roy Lyseng für diesen Workaround
.
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 Philippy Im Kommentar erwähnt, muss das Ergebnis eines Abfrageausdrucks unabhängig von angewendeten Optimierungen streng definiert sein. Das bedeutet, dass es sich um einen Optimierungsfehler in MySQL 5.7/8.0 handelt.