2009-08-26 10 views
53

मेरे पास एक PHP सरणी है जिसमें आईडी की संख्या है। ये संख्या पहले ही आदेशित हैं।MySQL ORDER BY()

अब मैं सभी आईडी प्राप्त करने के लिए IN() विधि के माध्यम से अपना परिणाम प्राप्त करना चाहता हूं।

हालांकि, इन आईडी को IN विधि में आदेश दिया जाना चाहिए।

उदाहरण के लिए:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

कोई सुझाव:

IN(4,7,3,8,9) 

की तरह एक परिणाम दे देना चाहिए? शायद ऐसा करने के लिए एक समारोह है?

धन्यवाद!

+0

उन संख्याओं से जुड़े अन्य डेटा क्या हैं? यह हमें एक सुराग दे सकता है कि आप इसे उस क्रम में क्यों चाहते हैं। – Randell

उत्तर

125

मुझे लगता है कि आप समारोह FIELD द्वारा खोजे जा रहे!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

बिल्कुल। मैं सिर्फ पॉल डबॉइस की माईएसक्यूएल कुकबुक में देख रहा था और पाया: चयन आईडी, जहां से आईडी (7,4,21) आईडी में आईडी (7,4,21) ऑर्डर (आईडी, 7,4,21) धन्यवाद! –

+0

डार आप लोग तेजी से हैं। ;-) – deceze

+0

@ हेनक, आपकी मदद करने में प्रसन्नता हुई, लेकिन एक स्वीकृति w/o एक अपवर्तनीय एसओ पर वास्तव में असाधारण घटना है - किसी भी कारण से आपने मुझे ऊपर नहीं छोड़ा? -) –

-3

आपको केवल कथन द्वारा सही क्रम देने की आवश्यकता होगी।

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

आप अपने उदाहरण में अपने डेटा को अनियंत्रित क्यों करना चाहते हैं?

आप लंबे प्रश्नों concatening कोई आपत्ति नहीं है, कि जिस तरह का प्रयास करें:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

धन्यवाद। लेकिन यह चाल नहीं करेगा: चयन आईडी, उन लेखों से नाम जहां आईडी (12,4,21) आईडी आईडी द्वारा आदेश 7,4,21 दिखाया जाना चाहिए। लेकिन इसके बजाय यह दिखाएगा: 4,7,21 ... –

+2

संघ * गारंटी * गारंटी आदेश नहीं करता है। – paxdiablo

+0

ठीक है, इसलिए मेरा दूसरा शॉट, वांछित 'आदेश' देगा लेकिन सबसे प्यारी चीज नहीं है। –

0

मानक SQL (MySQL हो सकता है ऐसा करने के लिए एक रास्ता प्रदान नहीं करता है, लेकिन मैं समाधान है कि विक्रेता के तटस्थ तो मैं कर रहे हैं पसंद करते हैं किसी भी समय डीबीएमएस स्विच कर सकते हैं)।

यह कुछ ऐसा है जो आपको में के बाद करना चाहिए परिणाम सेट वापस कर दिया गया है। एसक्यूएल केवल "ऑर्डर बाय" खंड में उल्लिखित क्रम में लौटा सकता है (या ऑर्डर में ऐसा कोई खंड नहीं है)।

अन्य संभावना (हालांकि मुझे यह पसंद नहीं है, मैं आपको पसंद देने के लिए सम्मानित हूं) डेटाबेस में कई यात्राएं करना है, प्रत्येक आईडी के लिए एक है, और इन्हें संसाधित करते समय उन्हें संसाधित करना है: भी है, जबकि सामान्य रूप से एक स्ट्रिंग समारोह के रूप में के बारे में सोचा है, यह संख्या के लिए ठीक काम करता है -

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

आप इसे मानक एसक्यूएल में कर सकते हैं 'केस कॉल WHEN * 1-वैल * फिर 1 कब * 2-वैल * फिर 2 ... END' – derobert

+1

... नहीं कि मैं ऐसी चीज की अनुशंसा करता हूं! – derobert

8

आप FIELD() इस्तेमाल कर सकते हैं:

ORDER BY FIELD(id, 3,2,5,7,8,1) 

में str1, str2, str3, ... सूची str के सूचकांक (स्थिति) देता है। यदि स्ट्रेट नहीं मिला है तो 0 देता है।

हालांकि यह एक बदसूरत हैक है, इसलिए वास्तव में केवल इसका उपयोग करें यदि आपके पास कोई अन्य विकल्प नहीं है। अपने ऐप में आउटपुट को सॉर्ट करना बेहतर हो सकता है।