2012-07-25 13 views
7

मैं तालिका से मूल्यों को कैसे ऑर्डर कर सकता हूं, जब वे डाले गए थे तब से आरोही। इस मामले के लिए कोई टाइममैंप या ऑटोइनक्रिकमेंट नहीं है।MySQL, प्रविष्टि आदेश द्वारा ऑर्डर, कोई सॉर्टिंग कॉलम

मुझे पता है कि यह करने की अनुशंसा नहीं की जाती है ... फिर भी मैं यह जानना चाहता हूं कि यह कैसे करें।

जैसा कि मैं उत्तर से समझता हूं, यदि कोई सॉर्टिंग कॉलम उदाहरण नहीं है: मानों को सम्मिलित करने से पहले टाइमस्टैम्प या ऑटोइनक्रमेंटल जोड़ा गया था, तो उन्हें सम्मिलन द्वारा क्रमबद्ध करने का कोई तरीका नहीं है।

उत्तर

7

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

एक साधारण क्वेरी के लिए जो तालिका में सभी पंक्तियों के सभी कॉलम लौटाता है ... उदा।

SELECT * FROM mytable ; 

इस तरह के एक प्रश्न के लिए, यह संभावना है कि MySQL तालिका की शुरुआत से, एक पूर्ण तालिका स्कैन प्रदर्शन करेंगे है, इसलिए यह संभावना है कि पंक्तियों क्रम में वे भौतिक संग्रहण में पाए जाते हैं में लौटा दी जाएगी है।

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

लेकिन, इस व्यवहार की गारंटी नहीं है। क्रम में पंक्तियों को वापस करने के लिए उन्हें पंक्ति में एक कॉलम के भीतर संग्रहीत किया गया था, आपको वास्तव में उस जानकारी (यानी, अनुक्रम जिसमें पंक्ति डाली गई थी) की आवश्यकता होती है।

+0

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

+0

लेकिन अवरोही क्रम में पंक्तियों को सॉर्ट करने के बारे में क्या है क्योंकि वे –

+1

@ भावेश गंगानी डाले गए हैं: हां, पंक्तियों को किसी विशेष अनुक्रम में डाला जा सकता है। लेकिन यह * गारंटी नहीं देता है कि एक चयन कथन पंक्तियों को डालने के क्रम में पंक्तियों को वापस करेगा, या किसी विशेष अनुक्रम में, 'ORDER BY' खंड में निर्दिष्ट अनुक्रम को छोड़कर। अगर हमें क्रमशः पंक्तियों को वापस करने की आवश्यकता है, तो हमें प्रत्येक पंक्ति के लिए यह जानकारी उपलब्ध करनी होगी। यह आमतौर पर पंक्ति में ही संग्रहीत होता है, लेकिन किनारे के मामले में, इसे किसी अन्य तालिका में संग्रहीत किया जा सकता है जहां इसे प्रत्येक पंक्ति के लिए लिया जा सकता है। – spencer7593

0

आपकी क्वेरी को ऑर्डर करने के लिए कॉलम होना आवश्यक है। आम तौर पर यह एक सम्मिलन टाइमस्टैम्प होगा, या आईडी/incrementing कुंजी बढ़ाना होगा। अन्यथा आदेश की गारंटी देने का कोई तरीका नहीं है, क्योंकि इसका कोई रिकॉर्ड नहीं है।

relevant thread from MySQL forum

+0

100% सुनिश्चित करें कि MySQL में सम्मिलन के समय या इस तरह के समान कुछ भी नहीं है? – jacktrades

+0

क्यों न केवल टाइमस्टैम्प कॉलम जोड़ें? और हाँ, 100% यकीन है। किसी क्वेरी को ऑर्डर करने के लिए, आपको * * द्वारा ऑर्डर करने के लिए कुछ चाहिए। – Dima

+0

पढ़ें MySQL फोरम से: 'आम तौर पर, आपको डीबी द्वारा लौटाई गई पंक्तियों के क्रम पर भरोसा नहीं करना चाहिए जब आपने कोई ऑर्डर निर्दिष्ट नहीं किया है' मुझे कोई निश्चितता नहीं दिखाई दे रही है। – jacktrades

1

आप ORDER BY कुछ आप अपनी तालिका से बाहर निकल सकते कर सकते हैं। यदि आपके पास वहां कुछ भी नहीं है जिसका उपयोग आपको आवश्यक आदेश खोजने के लिए किया जा सकता है, तो आप इसका ऑर्डर नहीं कर सकते हैं।

+0

क्या यह 100% सटीक है? – jacktrades

+2

ठीक है, यह एक जवाब जोड़ने के लिए अजीब होगा कि मुझे झूठा होना है, अब, है ना? आपके द्वारा स्वीकार किए गए उत्तर मूल रूप से वही कहते हैं, लेकिन किसी भी तरह से यह संकेत मिलता है कि आप कुछ और कर सकते हैं, कि आप वास्तव में नहीं कर सकते हैं। यदि आप ऑर्डर नहीं कर सकते हैं, तो आप ऑर्डर नहीं कर सकते। बाकी वास्तव में उल्लेखनीय लायक नहीं है .. – Nanne

1

तालिका में डेटा के आधार पर, आप डेटा की आईडी द्वारा ऑर्डर करने में सक्षम हो सकते हैं - यदि डेटा में पीके विशिष्टता सुनिश्चित करने के लिए एक एकल वृद्धिशील पूर्णांक है। प्रविष्टि आदेश को सॉर्ट करने का कोई दूसरा तरीका नहीं है जब तक कि डेटा कैप्चर नहीं किया जाता है और तालिका में दर्ज किया जाता है।

मुझे MySQL में कुछ भी नहीं पता है जो रिकॉर्ड स्तर पर अतिरिक्त (मेटा) जानकारी को बरकरार रखता है जिसे आपने तालिका स्तर पर निर्दिष्ट नहीं किया है।

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