MySQL में किसी विशिष्ट मान वाली पंक्ति को शीर्ष पर फिक्स करके, शेष पंक्तियों को रैंडम क्रम में प्रदर्शित करने के लिए, ORDER BY में बूलियन एक्सप्रेशन और RAND() का संयोजन उपयोग करें।
उदाहरण: मान 40 को शीर्ष पर रखें, बाकी रैंडम
डेमो टेबल बनाएं:
mysql> CREATE TABLE DemoTable1921 (Number INT);
डेटा इन्सर्ट करें:
mysql> INSERT INTO DemoTable1921 VALUES (40), (80), (820), (10);
क्वेरी:
mysql> SELECT * FROM DemoTable1921 ORDER BY (Number = 40) DESC, RAND();
आउटपुट (40 पहले, बाकी रैंडम):
+--------+ | Number | +--------+ | 40 | | 820 | | 10 | | 80 | +--------+
व्याख्या
(Number = 40): बूलियन एक्सप्रेशन, TRUE (1) यदि Number=40, FALSE (0) अन्यथाDESC: TRUE (1) को FALSE (0) से पहले रखता है → 40 शीर्ष परRAND(): शेष पंक्तियों (जहां एक्सप्रेशन 0 है) के लिए रैंडम क्रम
सामान्य पैटर्न
-- एकाधिक मानों को प्राथमिकता दें
ORDER BY (col IN ('val1', 'val2')) DESC, RAND()
-- एक कॉलम फिक्स करें, दूसरे द्वारा क्रमबद्ध करें
ORDER BY (priority = 'high') DESC, created_at ASC
-- केस स्टेटमेंट के साथ अधिक नियंत्रण
ORDER BY CASE
WHEN id = 100 THEN 1
WHEN id = 200 THEN 2
ELSE 3
END, RAND()
उपयोग के मामले
- फीचर्ड/स्पॉन्सर्ड आइटम शीर्ष पर, बाकी रैंडम
- "पिक ऑफ द डे" दिखाना, अन्य रैंडम
- पिन की गई पोस्ट शीर्ष पर, बाकी रैंडम/क्रमबद्ध
प्रदर्शन विचार
RAND()फाइलसॉर्ट मजबूर करता है, बड़े टेबल्स पर धीमा- बड़े डेटासेट के लिए: फीचर्ड आइटम अलग क्वेरी से लाएं, बाकी के लिए
ORDER BY RAND() LIMIT Nउपयोग करें - कैशिंग: रैंडम परिणाम कैश करें यदि रियल-टाइम रैंडमनेस आवश्यक नहीं
नोट
MySQL में TRUE = 1, FALSE = 0 होता है, इसलिए बूलियन एक्सप्रेशन सीधे ORDER BY में काम करते हैं। यह ट्रिक MySQL-विशिष्ट है (अन्य DB में CAST आवश्यक हो सकता है)।