MySQL - IN () के भीतर मूल्यों द्वारा आदेश


107

मैं निम्नलिखित क्वेरी में दिए गए आइटमों को उस क्रम से क्रमबद्ध करने की उम्मीद कर रहा हूं जो वे IN () फ़ंक्शन में दर्ज किए गए हैं

इनपुट:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

उत्पादन:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

कोई विचार?

जवाबों:


231
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

क्षेत्र समारोह तार के शेष सूची में पहले स्ट्रिंग की स्थिति देता है।

हालाँकि, एक अनुक्रमणित कॉलम का बेहतर प्रदर्शन-वार होना जो आपके सॉर्ट क्रम का प्रतिनिधित्व करता है, और फिर इस कॉलम द्वारा सॉर्ट करना है।


9
@ व्लादिमीर - हाँ, यह MySQL-specific है। प्रश्न में mysql टैग है।
अयमान होउरीह

डीबी स्विच के बाद ओरेकल के "डिकोड" फ़ंक्शन के लिए महान, प्रतिस्थापन।
मार्टिन लिन

7
सावधान। कोई भी अज्ञात संपत्ति मूल्य (सूची में नहीं) ज्ञात मूल्यों पर वरीयता लेगा, यानी FIELD(letter, 'A', 'C'), सूची पहले बी अक्षर के साथ प्रविष्टियां लौटाएगी ( A | B | Cमानों के साथ रिकॉर्ड का एक सेट मानकर )। उससे बचने के लिए, सूची पर उलटा और DESC का उपयोग करें, अर्थात FIELD(letter, 'C', 'A') DESC
गजस

मैं इसे SQL सर्वर में कैसे प्राप्त करूं।
user123456

29

यहां से एक अन्य विकल्प: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

तो आपके मामले में (निष्कलंक) होगा

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

आप जो कर रहे हैं उसके आधार पर मैंने इसे थोड़ा विचित्र पाया है लेकिन हमेशा इसे थोड़ा सा खेलने के बाद काम करने के लिए मिला है।


यह फ़ील्ड () फ़ंक्शन का उपयोग करने से बेहतर हो सकता है क्योंकि एक और उत्तर के रूप में कार्य किया जाता है क्योंकि फ़ील्ड का उपयोग करते हुए () इंडेक्स का उपयोग करना छोड़ देगा, लेकिन इसके लिए इस पद्धति का उपयोग करके एक इंडेक्स का उपयोग करने का मौका है (यह सुनिश्चित नहीं है कि यह इंडेक्स का उपयोग कितनी अच्छी तरह से कर सकता है, हालांकि)
28ıu


3

यह किसी की मदद कर सकता है (p_CustomerId सपा में पारित हो गया है):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

विवरण: मैं खाता सूची दिखाना चाहता हूं। यहाँ मैं sp में एक ग्राहक आईडी पास कर रहा हूँ। अब यह उन खातों से जुड़े नामों की सूची देगा, जिनसे ग्राहक शीर्ष पर दिखाए गए हैं, अन्य वर्णमाला क्रम में अन्य खातों के बाद।


2

आपको अपनी तालिका में एक और कॉलम (संख्यात्मक) चाहिए, जिसमें आप क्रमबद्ध क्रम को निर्दिष्ट करते हैं। IN क्लॉज इस तरह से काम नहीं करता है।

B - 1
A - 2
D - 3
E - 4
C - 5

2
वांछित आदेश प्रति-क्वेरी हो सकता है।
व्लादिमीर Dyuzhev

0

महज प्रयोग करें

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

जैसी स्थिति से बचें

 INSTR('1,2,3,11' ,`field`) 

अनियोजित परिणाम पंक्ति के साथ समाप्त हो जाएगा: 1 और 11 वैकल्पिक

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