MySQL में कस्टम ORDER BY ऑर्डर को कैसे परिभाषित करें


143

MySQL में मैं कस्टम छँटाई क्रम को कैसे परिभाषित करूँ।

इस तालिका पर विचार करने के लिए मैं क्या चाहता हूं:

ID  Language    Text
0   ENU         a
0   JPN         b
0   DAN         c       
1   ENU         d
1   JPN         e
1   DAN         f
2   etc...

यहां मैं भाषा और आरोही आईडी द्वारा छांटी गई सभी पंक्तियों को वापस करना चाहता हूं ताकि भाषा = ईएनयू पहले आए, फिर जेपीएन और अंत में एनएएन।

परिणाम होना चाहिए: ए, डी, बी, ई, सी, एफ आदि।

क्या यह भी संभव है?

जवाबों:


276

MySQL का एक आसान कार्य है, FIELD()जो इस तरह के कार्यों के लिए उत्कृष्ट है।

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

हालाँकि, ध्यान दें

  1. यह आपके SQL को कम पोर्टेबल बनाता है, क्योंकि अन्य DBMS में ऐसा फ़ंक्शन नहीं हो सकता है

  2. जब आपकी भाषाओं की सूची (या अन्य मानों को क्रमबद्ध करने के लिए) अधिक लंबी हो जाती है, तो उनके लिए अलग-अलग स्तंभ के साथ एक अलग तालिका रखना बेहतर होता है, और आदेश देने के लिए इसे अपने प्रश्नों में शामिल करें।


3
यह मेरी स्थिति के लिए पूरी तरह से धन्यवाद है, जहां मुझे सिर्फ दो मूल्यों (प्राथमिक भाषा, उदाहरण के लिए जेपीएन और एक बैकबैक भाषा, उदाहरण के लिए ईएनयू) के लिए ऑर्डर करना है।
म्यूलकिनर

4
यार तुम सिर्फ मुझे एक फिर से लिखना बचा लिया Magento में :)
एरिक सिमोनिक

1
यदि आपके पास GROUP BYपहले है तो क्या होगा ? उदाहरण के लिए, पहला मूल्य जो मैं चाहता हूं, अंत में दिखाई देता है?
पाथ्र्स

क्वेरी को GROUP BYएक सबक्वेरी में रखें , और इसे बाहरी क्वेरी में ऑर्डर करें
एमचेल

1
एक आकर्षण की तरह काम करें :)
Bran

53

यदि वे केवल तीन मूल्य हैं, तो आप एक CASEअभिव्यक्ति का उपयोग कर सकते हैं :

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         END

(यदि अन्य मान हो सकते हैं, तो आप ऑर्डर को सुसंगत रखने के लिए कुछ अतिरिक्त तर्क जोड़ना चाह सकते हैं; उदाहरण के लिए, आप ELSE 4उस CASEअभिव्यक्ति में जोड़ सकते हैं , और फिर Languageतीसरे क्रम के मानदंड के अनुसार खुद ही ऑर्डर कर सकते हैं :

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         ELSE 4
         END,
         `Language`

)


1
और यदि कई भाषा मूल्य हैं, तो आपके पास एक अलग तालिका हो सकती है जिसमें प्रत्येक भाषा के साथ-साथ एक क्रम क्रम स्तंभ और उससे लिंक हो
काज

1
यह पहले ID द्वारा आदेश देगा, जिसके परिणामस्वरूप a, b, c, d, e, f
piotrm

धन्यवाद, यह पूरी तरह से काम करता है - जैसा कि मैंने उत्तर दिया था, जिसे मैंने सरल के रूप में स्वीकार किया था
मुल्सकिनर

19

आपके पास कुछ विकल्प हैं, पहले, भाषा को ENUM होने के लिए बदलना है (यह मानते हुए कि यह संभव है, और आप केवल कुछ बदलावों की अपेक्षा करते हैं)

यदि आप इसे ENUM('ENU','JPN','DAN')तब तक निर्दिष्ट करते हैंORDER Language ASC आदेश आपके द्वारा निर्दिष्ट आदेश देगा।

दूसरे में कहीं न कहीं एक मामला शामिल होगा

SELECT * FROM table
ORDER BY CASE Language
    WHEN 'ENU' THEN 3
    WHEN 'JPN' THEN 2
    WHEN 'DAN' THEN 1
    ELSE 0
END DESC, ID ASC

प्रदर्शन-वार ENUM पद्धति तेजी से परिणाम लौटाएगी, लेकिन यदि आपको अधिक भाषाएँ जोड़ने की आवश्यकता है, तो अधिक परेशानी होगी। तीसरा विकल्प भाषाओं के लिए एक सामान्यीकरण तालिका जोड़ना होगा जो इस उदाहरण में ओवरकिल हो सकता है।


आप वास्तव में कहाँ टाइप करते हैं ENUM('ENU','JPN','DAN')?
पथरोस

1
तालिका परिभाषा में @pathros, आप इसे VARCHAR आदि के बजाय एक ENUM के रूप में निर्दिष्ट करते हैं। आंतरिक रूप से MySQL एक विशिष्ट क्रम में ENUM विकल्पों को संग्रहीत करता है और उन्हें अनुक्रमित करता है, और इसलिए जब एक ENUM कॉलम द्वारा आदेश दिया जाता है तो यह विशेष रूप से इसके बजाय उस आंतरिक स्तंभ का उपयोग करेगा। स्ट्रिंग मान (जब तक CAST () का उपयोग इसे VARCHAR में वापस करने के लिए नहीं किया जाता है)
साइमन माय स्कूल पोर्टल

नहीं END DESC,होना चाहिए END CASE DESC,?
इस्तियाक अहमद

नहीं। सभी की CASEजरूरत नहीं है END CASE, यह संदर्भ पर निर्भर है। CASEPROCEDURE के भीतर END CASE( dev.mysql.com/doc/refman/5.5/en/case.html ) हालांकि CASESELECT के भीतर की आवश्यकता नहीं है END CASE, बस END( dev.mysql.com/doc/refman/5.7/en/… ) - इस में संदर्भ यह एक नियंत्रण प्रवाह समारोह है।
साइमन माई स्कूल पोर्टल

1

Yii2 ढांचे के लिए हम निम्नलिखित तरीके से प्राप्त करते हैं

Project::find()
->orderBy([new Expression('FIELD(pid_is_t_m,2,0,1)'),'task_last_work'=> SORT_ASC])
->all();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.