2009-10-27 10 views
35

"में" MySQL में व्यवस्था बनाए रखने मैं निम्न तालिका हैक्वेरी

DROP TABLE IF EXISTS `test`.`foo`; 
CREATE TABLE `test`.`foo` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

तब मैं प्राथमिक कुंजी

SELECT * FROM foo f where f.id IN (2, 3, 1); 

मैं तो निम्न परिणाम

पाने के आधार पर रिकॉर्ड प्राप्त करने की कोशिश
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | first | 
| 2 | second | 
| 3 | third | 
+----+--------+ 
3 rows in set (0.00 sec) 

जैसा कि कोई भी देख सकता है, परिणाम आईडी द्वारा आदेश दिया जाता है। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह है कि मैं अनुक्रम में दिए गए परिणामों को आदेश में प्राप्त कर रहा हूं। इस उदाहरण यह

+----+--------+ 
| id | name | 
+----+--------+ 
| 2 | second | 
| 3 | third | 
| 1 | first | 
+----+--------+ 
3 rows in set (0.00 sec) 
+0

इस उत्तर को MySQL साइट पर देखें: http://forums.mysql.com/read.php?97,210905,210918#msg-210918 - मुझे लगता है कि आप() में होने वाली परेशानी में भागने जा रहे हैं इस तरह व्यवहार करने के लिए। MySQL वास्तव में परिणाम को सॉर्ट नहीं करता है जब तक कि आप इसे स्पष्ट रूप से नहीं बताते हैं, और आपके पास उस डेटा में कुछ भी नहीं है जो आपको इच्छित तरीके से सॉर्ट करेगा। – artlung

उत्तर

69

जैसा कि दूसरे उत्तर में उल्लेख किया गया है: आपके द्वारा पोस्ट की गई क्वेरी में आपके परिणामों के बारे में कुछ भी नहीं है, जिसके परिणाम आप प्राप्त करना चाहते हैं।

अपने परिणामों को आदेश करने के लिए, मैं क्षेत्र() द्वारा आदेश का प्रयोग करेंगे:

क्षेत्र के लिए
SELECT * FROM foo f where f.id IN (2, 3, 1) 
ORDER BY FIELD(f.id, 2, 3, 1); 

तर्क सूची चर लंबाई हो सकता है।

+1

ओह, हाँ, यह भी काम करता है। +1 –

+0

मुझे यह देखने में दिलचस्पी होगी कि आईडी द्वारा पंक्तियों को क्रमबद्ध करने के सामान्य मामले में या तो विधि का प्रदर्शन लाभ है या नहीं। मैंने हमेशा FIELD() का उपयोग किया है, लेकिन मैंने कोड के कुछ उदाहरण देखे हैं जो आपके द्वारा पोस्ट की गई FIND_IN_SET() विधि का उपयोग करते हैं। –

21

एक IN() विधेय में मानों एक सेट माना जाता है, और परिणाम एक SQL क्वेरी द्वारा लौटाए कोई तरीका नहीं होता है कि सेट से आदेश अनुमान लगाने के लिए है वापस आना होगा देखते हुए।

सामान्य तौर पर, किसी भी SQL क्वेरी के आदेश जब तक आप एक ORDER BY खंड के साथ एक आदेश निर्दिष्ट मनमाना है।

आप आप क्या चाहते करने के लिए एक MySQL समारोह FIND_IN_SET() उपयोग कर सकते हैं:

SELECT * FROM foo f where f.id IN (2, 3, 1) 
ORDER BY FIND_IN_SET(f.id, '2,3,1'); 

ध्यान दें कि FIND_IN_SET() को सूची तर्क IN() के तर्कों की तरह एक चर लंबाई सूची नहीं है। यह एक स्ट्रिंग अक्षर या SET होना चाहिए।


प्रदर्शन के बारे में पुन सवाल: VoteTypeId पर

कोई सूचकांक के साथ:

SELECT * FROM Votes ORDER BY FIND_IN_SET(VoteTypeId, '13,1,12,2,11,3,10,4,9,5,8,6,7'); 

3618992 rows in set (31.26 sec) 
3618992 rows in set (29.67 sec) 
3618992 rows in set (28.52 sec) 

SELECT * FROM Votes ORDER BY FIELD(VoteTypeId, 13,1,12,2,11,3,10,4,9,5,8,6,7); 

3618992 rows in set (37.30 sec) 
3618992 rows in set (49.65 sec) 
3618992 rows in set (41.69 sec) 
मैं कर रहा हूँ उत्सुक भी, इसलिए मैं दोनों FIND_IN_SET() और FIELD() StackOverflow डेटा की मेरी नकल के खिलाफ तरीकों की कोशिश की

वोटटेप आईडी पर एक इंडेक्स के साथ:

SELECT * FROM Votes ORDER BY FIND_IN_SET(VoteTypeId, '13,1,12,2,11,3,10,4,9,5,8,6,7'); 

3618992 rows in set (14.71 sec) 
3618992 rows in set (14.81 sec) 
3618992 rows in set (25.80 sec) 

SELECT * FROM Votes ORDER BY FIELD(VoteTypeId, 13,1,12,2,11,3,10,4,9,5,8,6,7); 

3618992 rows in set (19.03 sec) 
3618992 rows in set (14.59 sec) 
3618992 rows in set (14.43 sec) 

निष्कर्ष: सीमित परीक्षण के साथ, किसी भी विधि के लिए कोई बड़ा फायदा नहीं है।

+1

बहुत अच्छा है कि केस 'एक्स' फिर 1, केस 'वाई' फिर 2 मनमाने ढंग से ऑर्डर कॉलम – dnagirl

+0

के लिए धन्यवाद, यह स्पष्ट करने के लिए धन्यवाद - मैं दूसरे उत्तर के लिए गया क्योंकि चरम तर्क के साथ FIELD मेरे लिए अधिक सहज महसूस करता है। लेकिन मुझे प्रदर्शन तुलना में भी दिलचस्पी होगी। – msparer

+0

हाँ नहीं सोचा था कि कोई अंतर होने पर बहुत कुछ होगा, लेकिन परीक्षण परिणामों के लिए धन्यवाद :) –

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