सबक्वेरी के साथ RAND() और LIMIT का उपयोग
अंतिम N रिकॉर्ड्स से रैंडम रिकॉर्ड्स प्राप्त करने के लिए सबक्वेरी में ORDER BY ... DESC LIMIT का उपयोग करें, फिर बाहरी क्वेरी में ORDER BY RAND() LIMIT लागू करें।
उदाहरण: टेबल बनाना और डेटा इन्सर्ट करना
mysql> CREATE TABLE DemoTable773 (StudentId INT); Query OK, 0 rows affected (0.59 sec)
23 रिकॉर्ड्स इन्सर्ट करना
mysql> INSERT INTO DemoTable773 VALUES(100),(200),(300),(400),(500),
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(90),(91),(92),(93),(94),(95),(96),(97);
Query OK, 23 rows affected (...)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable773;
+-----------+ | StudentId | +-----------+ | 100 | | 200 | | 300 | | 400 | | 500 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 90 | | 91 | | 92 | | 93 | | 94 | | 95 | | 96 | | 97 | +-----------+ 23 rows in set (0.00 sec)
अंतिम 20 रिकॉर्ड्स से 5 रैंडम रिकॉर्ड्स की क्वेरी
mysql> SELECT * FROM (
SELECT * FROM DemoTable773 ORDER BY StudentId DESC LIMIT 20
) AS RANDOM_OUTPUT ORDER BY RAND() LIMIT 5;
संभावित आउटपुट (रैंडम)
+-----------+ | StudentId | +-----------+ | 95 | | 4 | | 10 | | 7 | | 300 | +-----------+ 5 rows in set (0.51 sec)
क्वेरी व्याख्या
- आंतरिक क्वेरी:
ORDER BY StudentId DESC LIMIT 20- नवीनतम 20 रिकॉर्ड्स चुनता है (यह मानकर कि उच्च ID नए रिकॉर्ड्स हैं) - बाहरी क्वेरी:
ORDER BY RAND() LIMIT 5- उन 20 रिकॉर्ड्स को रैंडम क्रम में व्यवस्थित करके 5 चुनता है - एलियास:
AS RANDOM_OUTPUT- सबक्वेरी के लिए आवश्यक एलियास
महत्वपूर्ण विचार
- प्रदर्शन: बड़े टेबल्स पर
ORDER BY RAND()धीमा हो सकता है - बेहतर विकल्प: बड़े डेटासेट्स के लिए, एप्लिकेशन लेयर पर रैंडम सैंपलिंग करें या
TABLESAMPLE(MySQL 8.0+) का उपयोग करें - क्रम निर्धारण: "अंतिम" रिकॉर्ड्स निर्धारित करने के लिए एक टाइमस्टैम्प या ऑटो-इन्क्रीमेंट कॉलम का उपयोग करें
अल्टरनेटिव: टाइमस्टैम्प आधारित
SELECT * FROM (
SELECT * FROM DemoTable773 ORDER BY CreatedAt DESC LIMIT 20
) AS recent ORDER BY RAND() LIMIT 5;