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

Underforespørgsels rand()-kolonne revurderet for hver gentagen valg i MySQL 5.7/8.0 vs. MySQL 5.6

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 til den afledte tabeldefinition (jeg bruger signeret LONG_MAX nedenfor). Tak til Roy Lyseng for denne løsning .

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.




  1. MySQL SELECT-funktion til at summere aktuelle data

  2. PDO bindParam problem

  3. Opret et indeks på en enorm MySQL-produktionstabel uden tabellåsning

  4. Hvordan optimerer man forespørgslen, hvis tabellen indeholder 10000 poster ved hjælp af MySQL?