बड़ी टेबल से हाल की N पंक्तियों में से रैंडम नमूना लेने के लिए: पहले सबक्वेरी में ORDER BY id DESC LIMIT N से हाल की पंक्तियाँ लें, फिर बाहरी क्वेरी में ORDER BY RAND() LIMIT M लागू करें।
टेबल बनाएं (केवल ID)
mysql> CREATE TABLE DemoTable1853 (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
58 पंक्तियाँ डालें
mysql> INSERT INTO DemoTable1853 VALUES(),(),(),()...; -- 58 पंक्तियाँ
अंतिम 50 में से 5 रैंडम चुनें
mysql> SELECT tbl.*
FROM (
SELECT tbl1.*
FROM DemoTable1853 tbl1
ORDER BY UserId DESC
LIMIT 50
) tbl
ORDER BY RAND()
LIMIT 5;
आउटपुट (उदाहरण):
+--------+ | UserId | +--------+ | 19 | | 24 | | 43 | | 36 | | 48 | +--------+
चरण-दर-चरण
- आंतरिक क्वेरी:
ORDER BY UserId DESC LIMIT 50→ नवीनतम 50 आईडी (9 से 58)। - बाहरी क्वेरी: उन 50 को
ORDER BY RAND()से फेरबदल करें। LIMIT 5→ पहले 5 चुनें।
प्रदर्शन चेतावनी
ORDER BY RAND()बड़ी परिणाम सेट पर धीमा है (अस्थायी टेबल + फाइलसॉर्ट)।- यहां केवल 50 पंक्तियों पर लागू होता है, इसलिए ठीक है।
- बड़े नमूने के लिए:
WHERE RAND() < (sample_size / table_size)याTABLESAMPLE(MySQL 8.0.31+) उपयोग करें।
विकल्प: ऑफसेट-आधारित रैंडम
SELECT * FROM DemoTable1853 WHERE UserId >= (SELECT FLOOR(RAND() * (SELECT MAX(UserId) FROM DemoTable1853))) ORDER BY UserId LIMIT 5;
यह इंडेक्स उपयोग करता है लेकिन वितरण समान नहीं हो सकता।