2009-09-03 12 views
7

उदाहरण के लिए: का चयन करें * टी जहां T.id में (4,78,12,45)MySQL 'में खंड और वापस आ रिकॉर्ड सेट आदेश

मैं वापस आ रिकॉर्ड स्थिति से सिर्फ क्रम निर्धारित चाहते से 'आईएन' खंड में। मैं यह कैसे कर सकता हूं?

उत्तर

20

आप FIND_IN_SET का उपयोग कर ऐसा कर सकेगा, उदा

उदाहरण के लिए, यदि आप एक अस्थायी तालिका कि निम्नलिखित की तरह कुछ शामिल है

SELECT * FROM T WHERE T.id IN(4,78,12,45) 
ORDER BY FIND_IN_SET(T.id,'4,78,12,45'); 

जबकि आपको सूची को डुप्लिकेट करना होगा, यदि आप कोड में क्वेरी जेनरेट कर रहे हैं तो यह एक बड़ी समस्या नहीं है।

+0

+1 मुझे कुछ ऐसा करने के लिए +1 जो मुझे MySQL के बारे में नहीं पता था! – Welbog

+0

+1 अच्छा और साफ! मुझे यह पसंद है, एसक्यूएल सर्वर की इच्छा है। –

+0

इस तरह के छोटे मामलों के लिए, यह बहुत ही कुशल होना चाहिए, लेकिन यदि आपकी चयन सूची बड़ी है, तो मैं कल्पना करूंगा कि अस्थायी तालिका दृष्टिकोण अधिक कुशल होने जा रहा है। –

1

सामान्य मामले में, आप नहीं कर सकते हैं। जब तक आप ORDER BY खंड का उपयोग नहीं करते हैं, तब तक SQL ऑर्डर की गारंटी नहीं देता है, और इसे IN कथन की सामग्री में बंधे नहीं जा सकते हैं।

हालांकि, यदि आप एक अस्थायी तालिका बना सकते हैं जो आपके द्वारा चुने गए मानों का ऑर्डर करता है, तो आप उस तालिका और क्रम में शामिल हो सकते हैं।

id | order 
----+------ 
4 | 1 
78 | 2 
12 | 3 
45 | 4 

तो फिर तुम इस तरह यह आदेश कर सकते हैं:

SELECT T.* 
FROM T 
INNER JOIN temp 
ON T.id = temp.id 
ORDER BY temp.order ASC 
+0

जबकि मुझे पॉल डिक्सन समाधान की सफाई की सफाई पसंद है। यह समझना आसान हो सकता है और यहां तक ​​कि तेज़ भी हो सकता है। –

0

आप इन क्लॉज द्वारा ऑर्डर नहीं कर सकते हैं। आपको खंड द्वारा एक अलग आदेश प्रदान करना होगा। ऐसा करने का एक तरीका है ऑर्डर द्वारा ऑर्डर स्टेटमेंट बनाकर। हालांकि यह सुंदर नहीं है।

SELECT 
    * 
FROM 
    T 
WHERE 
    T.Id IN(4, 78, 12, 45) 
ORDER BY 
    CASE 
     WHEN T.Id = 4 THEN 1 
     WHEN T.Id = 78 THEN 2 
     WHEN T.Id = 12 THEN 3 
     WHEN T.Id = 45 THEN 4 
    END 
संबंधित मुद्दे