पहले विशिष्ट फ़ील्ड मान द्वारा ऑर्डर करना


89

मेरे पास 3 कॉलम वाली एक तालिका है:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

मैं परिणाम सेट का उपयोग करना चाहता हूं, priorityलेकिन पहले उन पंक्तियों को name=core, जो कम प्राथमिकता होने पर भी। परिणाम इस तरह दिखना चाहिए

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

जवाबों:


155

MySQL FIELDफ़ंक्शन भी है ।

यदि आप सभी संभावित मूल्यों के लिए पूर्ण छांटना चाहते हैं:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

यदि आप केवल इस बात पर ध्यान देते हैं कि "कोर" पहले है और दूसरे मूल्य मायने नहीं रखते:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

यदि आप पहले "कोर", और अन्य क्षेत्रों को सामान्य क्रम में क्रमबद्ध करना चाहते हैं:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

हालांकि, यहाँ कुछ चेतावनी हैं:

पहला, मुझे पूरा यकीन है कि यह mysql- केवल कार्यक्षमता है - प्रश्न को mysql टैग किया गया है, लेकिन आप कभी नहीं जानते।

दूसरा, ध्यान दें कि कैसे FIELD()काम करता है: यह मूल्य के एक-आधारित सूचकांक को लौटाता है - के मामले में FIELD(priority, "core"), यह 1 लौटाएगा यदि "कोर" मूल्य है। यदि फ़ील्ड का मान सूची में नहीं है, तो यह शून्य देता है । यह DESCतब तक आवश्यक है जब तक आप सभी संभावित मूल्यों को निर्दिष्ट नहीं करते।


5
लगभग 5 वर्षों के बाद मैंने इसका उत्तर स्वीकार कर लिया क्योंकि यह क्लीनर और तेज है।
ओमिड

db2 के बराबर?
साइबरनोक

यह मेरे लिए काम करता है, एक और सवाल पूछना चाहता हूं कि कैसे संभालें यदि कॉलम 'प्राथमिकता' में पूर्व जैसे मान शामिल हैं: 'अर्थ कोर', 'नया बोर्ड' आदि। यहां कॉलम में सटीक मान नहीं है, तो क्या हम कुछ ऐसा लिख ​​सकते हैं % कोर%?
जयंत सुवर्णा

@JayanthSuvarna: MySQL FIELD () डॉक्स को देखकर, मुझे पूरा यकीन है कि इसे सब्सट्रेटिंग के रूप में मूल्यांकन करने का कोई तरीका नहीं है, क्योंकि प्रत्येक तर्क को किसी प्रकार का स्ट्रिंग होना चाहिए। कुछ स्ट्रिंग हेरफेर फ़ंक्शन हो सकते हैं जो मदद कर सकते हैं, लेकिन मुझे यकीन नहीं है।
Nerdmaster

धन्यवाद दोस्त। आपने मेरा दिन बना दिया।
बिंगप्रभू

92

आम तौर पर आप कर सकते हैं

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

विशेष रूप से MySQL में आप भी कर सकते हैं

select * from your_table
order by name <> 'core',
         priority 

चूंकि MySQL में एक तुलना का परिणाम 0या तो है या 1आप उस परिणाम के आधार पर छाँट सकते हैं।


1
यहाँ क्या करता है 1और क्या करता 2है?
नीरज चौहान

1
मुझे सॉर्ट करने के लिए लगभग 3000 पंक्तियाँ हैं। मेरे मामले में stackoverflow.com/questions/958627/… पर @ अयमान-होरीह का समाधान इस समाधान की तुलना में आधा समय लगता है।
रात्रि विश्राम

@ रात का खाना: अच्छा है। केवल एक नोट: तेज़ समाधान MySQL- विशिष्ट है।
juergen d

1और 2डेटा को सॉर्ट करने के लिए मैं सिर्फ 2 नंबर का उपयोग करता हूं। हो सकता है 3और 4या कुछ और।
juergen d

जब खंड %में है तो क्या होगा WHERE? पसंद है . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
ढेर

6

विशिष्ट पंक्तियों को वरीयता देने का एक तरीका उनकी प्राथमिकता में बड़ी संख्या को जोड़ना है। आप एक CASEबयान के साथ ऐसा कर सकते हैं :

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

डेमो: http://www.sqlfiddle.com/#/2/753ee/1


5

यह मेरे लिए पोस्टग्रैस 9+ का उपयोग करके काम करता है:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

समझाने की परवाह -1? त्रुटि + संस्करण को पोस्टग्रेट करता है?
वोजटेक विटेक

3

एक तरीका यह है:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

1
क्या यह coreपंक्तियों का क्रम नहीं खोएगा ?
मेलमोकब

1
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

3
यद्यपि आपका कोड प्रश्न का उत्तर हो सकता है, लेकिन इसके बारे में कुछ स्पष्टीकरण देना बेहतर है।
मेहरबान

0

यह करो:

SELECT * FROM table ORDER BY column `name`+0 ASC

+0 लगाने का मतलब यह होगा कि:

0, 10, 11, 2, 3, 4

बन जाता है:

0, 2, 3, 4, 10, 11

यह तकनीक एक स्ट्रिंग को एक संख्या में बदलने के लिए है। यह ओपी के प्रश्न को संबोधित नहीं करता है। (हालाँकि, इसके प्रारूप को देखे बिना priority, मैं यह नहीं कह सकता कि क्या यह संपूर्ण समाधान का हिस्सा होना चाहिए ।)
रिक जेम्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.