sql >> Databasteknik >  >> RDS >> Mysql

Subquerys rand()-kolumn omvärderas för varje upprepat val i MySQL 5.7/8.0 vs MySQL 5.6

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 till den härledda tabelldefinitionen (jag använder signerad LONG_MAX nedan). Tack till Roy Lyseng för denna 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 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.




  1. Hur man importerar en MySQL-dump från kommandoraden MED överskrivning

  2. Fel:R kan inte ansluta till MySQL

  3. PostgreSQL - max antal parametrar i IN-klausul?

  4. Sammanfoga en sträng och ett nummer i PostgreSQL