MySQL में विशिष्ट मान को शीर्ष पर रखकर कस्टम ऑर्डरिंग
MySQL में आप बूलियन अभिव्यक्ति (Column = Value) DESC का उपयोग करके एक विशिष्ट मान को शीर्ष पर रख सकते हैं, उसके बाद शेष मानों को आरोही (या अवरोही) क्रम में रख सकते हैं।
टेबल बनाना
mysql> CREATE TABLE DemoTable (
-> MonthNumber INT
-> );
Query OK, 0 rows affected (1.68 sec)
डेटा डालना
mysql> INSERT INTO DemoTable VALUES (10);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES (1);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable VALUES (9);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO DemoTable VALUES (6);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable VALUES (8);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO DemoTable VALUES (5);
Query OK, 1 row affected (0.11 sec)
मूल डेटा (सम्मिलन क्रम)
mysql> SELECT * FROM DemoTable;
+-------------+
| MonthNumber |
+-------------+
| 10 |
| 1 |
| 9 |
| 6 |
| 8 |
| 5 |
+-------------+
6 rows in set (0.00 sec)
MonthNumber=5 को शीर्ष पर रखने का क्वेरी, बाकी आरोही क्रम में
mysql> SELECT * FROM DemoTable
-> ORDER BY MonthNumber = 5 DESC, MonthNumber ASC;
परिणाम
+-------------+
| MonthNumber |
+-------------+
| 5 |
| 1 |
| 6 |
| 8 |
| 9 |
| 10 |
+-------------+
6 rows in set (0.00 sec)
यह कैसे काम करता है
MonthNumber = 5बूलियन अभिव्यक्ति है: 5 के लिए TRUE (1), अन्य के लिए FALSE (0)DESC: TRUE (1) पहले आता है, फिर FALSE (0)MonthNumber ASC: FALSE समूह के भीतर, आरोही क्रम में क्रमबद्ध
समतुल्य CASE WHEN सिंटैक्स (अधिक स्पष्ट)
SELECT * FROM DemoTable
ORDER BY CASE WHEN MonthNumber = 5 THEN 0 ELSE 1 END, MonthNumber;
FIELD() फ़ंक्शन का उपयोग (एकाधिक प्राथमिकता मानों के लिए)
-- 5 पहले, फिर 1, फिर बाकी आरोही
SELECT * FROM DemoTable
ORDER BY FIELD(MonthNumber, 5, 1) DESC, MonthNumber ASC;
FIELD() सूची में मान की 1-आधारित स्थिति लौटाता है (नहीं मिलने पर 0)।
व्यावहारिक उदाहरण
विशिष्ट स्थिति कोड प्राथमिकता
SELECT * FROM Orders
ORDER BY FIELD(Status, 'URGENT', 'HIGH', 'NORMAL', 'LOW') DESC, CreatedAt;
विशिष्ट उपयोगकर्ता प्रकार पहले
SELECT * FROM Users
ORDER BY (UserType = 'ADMIN') DESC, (UserType = 'PREMIUM') DESC, UserName;
डिफ़ॉल्ट/फॉलबैक मान अंत में
SELECT * FROM Settings
ORDER BY (SettingName = 'DEFAULT') ASC, SettingName; -- DEFAULT अंत में
प्रदर्शन नोट
- बूलियन अभिव्यक्ति इंडेक्स का उपयोग नहीं कर सकती
- बड़े टेबल्स के लिए, एक सॉर्ट_ऑर्डर कॉलम जोड़ने पर विचार करें
- यदि संभव हो तो WHERE के साथ संयुक्त परिणाम सेट को पहले फ़िल्टर करें
अवरोही क्रम के लिए शेष मान
-- 5 पहले, फिर बाकी अवरोही
SELECT * FROM DemoTable
ORDER BY (MonthNumber = 5) DESC, MonthNumber DESC;
एकाधिक विशिष्ट मान (प्राथमिकता क्रम में)
SELECT * FROM DemoTable
ORDER BY
(MonthNumber = 5) DESC,
(MonthNumber = 1) DESC,
MonthNumber ASC;