2009-06-06 8 views
76

के भीतर मानों द्वारा आदेश द्वारा निम्न क्वेरी में लौटाई गई वस्तुओं को क्रमबद्ध करने की उम्मीद है, वे IN() फ़ंक्शन में दर्ज किए गए क्रम को क्रमबद्ध करें।MySQL - INRER 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  | 

कोई भी विचार?

उत्तर

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

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

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

+0

ओह, यह काफी अच्छा है! मुझे संदेह है कि यह MySQL- विशिष्ट है? –

+9

@Vladimir - हाँ, यह MySQL- विशिष्ट है। प्रश्न में MySQL टैग है। –

+0

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

2

आपको अपनी तालिका में एक और कॉलम (संख्यात्मक) की आवश्यकता है, जिसमें आप सॉर्ट ऑर्डर निर्दिष्ट करते हैं। आईएन क्लॉज इस तरह से काम नहीं करता है।

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

वांछित क्रम प्रति-प्रश्न हो सकता है। –

4

तरह

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ... 
25

यहां से एक अन्य विकल्प: 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; 
अपने मामले में

तो (untested) होगा

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'; 

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

+0

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

+0

यह MySQL 5.6 पर काम नहीं करता है: http://sqlfiddle.com/#!9/9bd6c5/3। – Lacek

+1

@Lacek यह करता है http://sqlfiddle.com/#!9/9bd6c5/5 – trrrrrrm

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; 

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

0

बस का उपयोग

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

तरह

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

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^