MySQL में सबक्वेरी का उपयोग करके पहले नवीनतम N पंक्तियाँ चुनें, फिर उनमें से रैंडम नमूना लें।
उदाहरण: टेबल बनाना और 29 रिकॉर्ड डालना
mysql> CREATE TABLE DemoTable (
-> ShippingDate DATETIME
-> );
Query OK, 0 rows affected (0.51 sec)
जनवरी से मई 2019 तक की विभिन्न दिनांक डालें (29 पंक्तियाँ)।
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable;
आउटपुट (29 पंक्तियाँ)
+---------------------+ | ShippingDate | +---------------------+ | 2019-01-01 00:00:00 | | 2019-01-03 00:00:00 | | ... | | 2019-05-18 00:00:00 | +---------------------+ 29 rows in set (0.00 sec)
नवीनतम 20 पंक्तियों में से 5 रैंडम पंक्तियाँ चुनना
mysql> SELECT tbl1.* FROM (
-> SELECT * FROM DemoTable ORDER BY ShippingDate DESC LIMIT 20
-> ) AS tbl1
-> ORDER BY RAND() LIMIT 5;
आउटपुट (उदाहरण - हर बार अलग)
+---------------------+ | ShippingDate | +---------------------+ | 2019-03-14 00:00:00 | | 2019-05-13 00:00:00 | | 2019-03-25 00:00:00 | | 2019-05-16 00:00:00 | | 2019-03-10 00:00:00 | +---------------------+ 5 rows in set (0.04 sec)
चरण-दर-चरण:
- आंतरिक क्वेरी:
ORDER BY ShippingDate DESC LIMIT 20- नवीनतम 20 पंक्तियाँ चुनता है - बाहरी क्वेरी:
ORDER BY RAND() LIMIT 5- उन 20 में से 5 रैंडम चुनता है
प्रदर्शन विचार:
- आंतरिक LIMIT इंडेक्स स्कैन को सीमित करता है (यदि ShippingDate पर इंडेक्स है)
- बाहरी RAND() केवल 20 पंक्तियों पर काम करता है (तेज़)
- बड़ी टेबल के लिए:
WHERE ShippingDate >= (SELECT ShippingDate FROM DemoTable ORDER BY ShippingDate DESC LIMIT 1 OFFSET 19)जैसी शर्त का उपयोग करें
MySQL 8.0+ विकल्प: CTE (WITH क्लॉज) का उपयोग करके पठनीयता सुधारें।