2011-07-12 11 views
14

मेरी डेटाबेस में साथ पंक्तियों आदेश मैं कुछ रिकॉर्ड जहां मैं क्या एक ही मूल्य होता है द्वारा छँटाई रहा है:कैसे mysql में एक ही मान

| col1 | timestamp    | 
| row1 | 2011-07-01 00:00:00 | 
| row2 | 2011-07-01 00:00:00 | 
| row3 | 2011-07-01 00:00:00 | 

SELECT ... ORDER BY timestamp 

ऐसा लगता है कि परिणाम की तरह एक यादृच्छिक क्रम में है। यादृच्छिक क्रम संगत है। इसका मतलब है कि अगर मेरे पास दो mysql सर्वरों में ये डेटा हैं। क्या मैं एक ही परिणाम की उम्मीद कर सकता हूं?

उत्तर

10

मैं उस धारणा को बनाने के खिलाफ सलाह दूंगा। मानक एसक्यूएल में, किसी भी स्पष्ट ORDER BY खंड द्वारा आवश्यक कुछ भी कार्यान्वयन निर्भर नहीं है।

मैं MySQL के लिए बात नहीं कर सकता, लेकिन उदा। एसक्यूएल सर्वर, पंक्तियों के लिए आउटपुट ऑर्डर जो कि ORDER BY तक "बराबर" हैं, संबंधित प्रश्न हर बार भिन्न हो सकते हैं - और व्यावहारिक रूप से कुछ भी प्रभावित हो सकता है (उदाहरण के लिए सर्वर का पैच/सर्विस पैक स्तर, वर्कलोड, पेज वर्तमान में बफर पूल, आदि में हैं)।

तो यदि आप को एक विशिष्ट ऑर्डर की आवश्यकता है, तो आप सबसे अच्छी चीज कर सकते हैं (दोनों इसकी गारंटी के लिए, और भविष्य में रखरखाव के लिए अपनी क्वेरी दस्तावेज करने के लिए) स्पष्ट रूप से आपके इच्छित आदेश का अनुरोध करते हैं।

+4

+1 टिप्पणी:

'आईडी' स्तंभ जोड़ने के बाद, जैसे आपकी क्वेरी के अंतिम भाग को अद्यतन एक और स्तंभ आप संगत परिणाम प्राप्त करने के लिए एक दूसरे तर्क के रूप में से आदेश कर सकते हैं – Jacob

+0

आदेश के लिए देखो कि पंक्तियों को वापस लौटाया जाता है, केवल 'ऑर्डर बाय' क्लॉज (या MySQL में, 'ग्रुप बाय' क्लॉज में उल्लिखित 'ORDER BY 'द्वारा गारंटीकृत है। इसके अलावा, ऑर्डर पंक्तियों की कोई गारंटी नहीं दी जाएगी इसके अलावा, MySQL किसी अनुक्रम में पंक्तियों को वापस करने के लिए स्वतंत्र है। – spencer7593

2

यह प्रयुक्त स्टोरेज इंजन पर निर्भर करता है। माईसाम में उन्हें प्राकृतिक क्रम में आदेश दिया जाएगा (यानी वे डिस्क पर संग्रहीत हैं - जिसे ALTER TABLE ... ORDER BY कमांड का उपयोग करके बदला जा सकता है)। इनो डीबी में उन्हें पीके द्वारा आदेश दिया जाएगा। अन्य इंजनों के अपने नियम हो सकते हैं।

+0

यह पीके के बिना InnoDB है ... – atiking

+1

InnoDB हमेशा एक पीके है। यदि आपने स्पष्ट रूप से कोई नहीं बनाया है, तो InnoDB ने इसे अपना 6 बाइट पीके बनाया है। – Mchl

+0

तो यादृच्छिक क्रम संगत नहीं है, क्योंकि पीके अलग हो सकता है? – atiking

2

यदि स्थिति पंक्तियां समान हैं या यदि आप ऑर्डर द्वारा ऑर्डर करके डेटा व्यवस्थित करना चाहते हैं तो ऑर्डर द्वारा ऑर्डर करें। मामला: आप कॉलम के मानों के अनुसार आदेश देना चाहते हैं शब्दों की आवृत्ति। और तालिका में दो शब्दों में आवृत्ति घटना कॉलम में समान आवृत्ति मान हो सकता है .. तो आवृत्ति कॉलम में आपके पास दो अलग-अलग शब्दों की दो समान आवृत्तियों होगी। तो, "select * डेटाबेस_नाम ऑर्डर द्वारा आवृत्ति द्वारा" चुनें * आप में से किसी एक को दो आवृत्तियों को एक ही आवृत्ति दिखाई दे सकती है जो उसके बाद के पहले दिखाई दे रही है। और दूसरे भाग में दूसरा शब्द जो पहले दिखाए गए पहले शब्द के बाद दिखा रहा था। यह बफर मेमोरी पर निर्भर करता है, इस समय पेजों में और बाहर जा रहे हैं ..

6

लूत के उत्तर पहले से ही हैं, लेकिन नीचे पंक्ति का जवाब NO है।

यदि आप पंक्तियों को एक विशेष अनुक्रम में लौटा चाहते हैं, तो लगातार ORDER BY में निर्दिष्ट करें। इसके बिना, बिल्कुल कोई गारंटी नहीं है कि

मुझे लगता है कि आप क्या खो सकते हैं यह है कि ORDER BY खंड में कई अभिव्यक्तियां सूचीबद्ध हो सकती हैं। और आप उन अभिव्यक्तियों को शामिल कर सकते हैं जो SELECT सूची में नहीं हैं।

आपके मामले में, उदाहरण के लिए, आप ORDER BY timestamp, id का उपयोग कर सकते हैं।

(या कुछ अन्य स्तंभों या भाव।)

कि पंक्तियों को पहले टाइमस्टैम्प पर, और उसके बाद किसी भी पंक्तियों उस टाइमस्टैंप के लिए एक ही मूल्य id द्वारा आदेश दिया जाएगा, या जो कुछ भी अगले अभिव्यक्ति इस में आदेश देगा सूची है

1

उत्तर है: नहीं, आदेश सुसंगत नहीं होगा। मुझे एक ही मुद्दे का सामना करना पड़ा और ऑर्डर सेक्शन में एक और कॉलम जोड़कर हल किया गया। सुनिश्चित करें कि यह कॉलम 'आईडी' या जो भी हो, प्रत्येक रिकॉर्ड के लिए अद्वितीय है।

इस मामले में, आपको अपनी तालिका में 'आईडी' फ़ील्ड जोड़ना होगा जो प्रत्येक रिकॉर्ड के लिए अद्वितीय है। आप इसे 'एआई' (ऑटो वृद्धि) असाइन कर सकते हैं ताकि आप रखरखाव से निपटने वाले नहीं हैं।

SELECT mt.* 
FROM my_table mt 
ORDER BY mt.timestamp ASC, mt.id DESC 
संबंधित मुद्दे