जैसा कि MySQL 8.0.0 माइलस्टोन रिलीज में बताया गया है उपलब्ध है ,
मुझे लगता है कि यह उस व्यवहार का कारण है जो मैं MySQL के नए संस्करणों में देख रहा हूं। उल्लिखित संकेत का उपयोग MySQL 8.0 के साथ RAND() को केवल एक बार कॉल करने के लिए मजबूर करने के लिए किया जा सकता है:
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 |
+---+-----+-----+
हालांकि यह 5.7 में उपलब्ध नहीं है। 5.7 के साथ वांछित व्यवहार प्राप्त करने के लिए, LIMIT <a very high number>
add जोड़ें व्युत्पन्न तालिका परिभाषा के लिए (मैं नीचे हस्ताक्षरित LONG_MAX का उपयोग कर रहा हूं)। इसके लिए रॉय लिसेंग को धन्यवाद समाधान
।
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 |
+---+-----+-----+
फिलिप्सी . के रूप में टिप्पणी में उल्लेख किया गया है, किसी भी अनुकूलन को लागू किए बिना एक क्वेरी अभिव्यक्ति के परिणाम को सख्ती से परिभाषित किया जाना चाहिए। जिसका अर्थ है कि यह MySQL 5.7/8.0 में एक अनुकूलक बग है।