MySQL में परिणाम सेट के पहले भाग को रैंडम क्रम में और शेष भाग को विशिष्ट क्रम में प्राप्त करने के लिए, ORDER BY CASE स्टेटमेंट का उपयोग करें। यह फीचर्ड/प्रायोरिटी आइटम को रैंडमाइज़ करके दिखाने और बाकी को क्रमबद्ध रखने के लिए उपयोगी है।
उदाहरण: 'Highest' प्रायोरिटी रैंडम, 'Lowest' क्रमबद्ध
डेमो टेबल बनाएं:
mysql> CREATE TABLE DemoTable1926 (
Position VARCHAR(20),
Number INT
);
डेटा इन्सर्ट करें:
mysql> INSERT INTO DemoTable1926 VALUES
('Highest', 50), ('Highest', 30),
('Lowest', 100), ('Lowest', 120), ('Lowest', 90);
डेटा:
+----------+--------+ | Position | Number | +----------+--------+ | Highest | 50 | | Highest | 30 | | Lowest | 100 | | Lowest | 120 | | Lowest | 90 | +----------+--------+
ORDER BY CASE के साथ क्वेरी:
mysql> SELECT * FROM DemoTable1926
ORDER BY Position DESC,
CASE Position WHEN 'Highest' THEN RAND() ELSE Number END ASC;
आउटपुट (Highest रैंडम, Lowest Number द्वारा ASC):
+----------+--------+ | Position | Number | +----------+--------+ | Lowest | 90 | | Lowest | 100 | | Lowest | 120 | | Highest | 50 | | Highest | 30 | +----------+--------+
व्याख्या
Position DESC: 'Lowest' पहले आता है (L > H वर्णानुक्रम में), फिर 'Highest'CASE Position WHEN 'Highest' THEN RAND() ELSE Number END:- 'Highest' पंक्तियों के लिए:
RAND()→ रैंडम क्रम - 'Lowest' पंक्तियों के लिए:
Number→ संख्यात्मक क्रम
- 'Highest' पंक्तियों के लिए:
ASC: दोनों समूहों के लिए आरोही क्रम
वैकल्पिक: UNION ALL दृष्टिकोण (अधिक स्पष्ट)
(SELECT * FROM DemoTable1926 WHERE Position = 'Highest' ORDER BY RAND()) UNION ALL (SELECT * FROM DemoTable1926 WHERE Position = 'Lowest' ORDER BY Number);
उपयोग के मामले
- फीचर्ड प्रोडक्ट्स को रैंडमाइज़ करना, बाकी को कीमत के अनुसार क्रमबद्ध
- प्रायोरिटी नोटिफिकेशन को मिक्स करना, सामान्य को तारीख के अनुसार
- A/B टेस्टिंग के लिए वेरिएंट रैंडमाइज़ करना
प्रदर्शन नोट
RAND() बड़े डेटासेट पर धीमा हो सकता है क्योंकि यह इंडेक्स का उपयोग नहीं कर सकता। बड़े 'Highest' समूह के लिए, एप्लिकेशन लेयर पर रैंडमाइज़ करना या ORDER BY RAND() LIMIT N के साथ सबक्वेरी बेहतर हो सकती है।