थोड़ी खुदाई के बाद, मैं आपके दोनों परिदृश्यों की पुष्टि कर सकता हूँ:
MySQL 5.1 ORDER BY
. को लागू करता है सबक्वेरी के अंदर।
Linux पर MariaDB 5.5.39 नहीं करता है ORDER BY
लागू करें सबक्वेरी के अंदर जब कोई LIMIT
. नहीं है भेज दिया गया है। यह करता है हालांकि, जब कोई संगत LIMIT
. हो तो आदेश को सही ढंग से लागू करें दिया गया है:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
उसके बिना LIMIT
, सबक्वेरी के अंदर सॉर्ट को लागू करने का कोई अच्छा कारण नहीं है। इसे बाहरी क्वेरी पर समान रूप से लागू किया जा सकता है।
दस्तावेज व्यवहार:
जैसा कि पता चला, MariaDB ने इस व्यवहार का दस्तावेजीकरण किया है और इसे बग नहीं माना जाता है:
<ब्लॉकक्वॉट>
एक "टेबल" (और FROM
. में सबक्वेरी) क्लॉज भी) है - SQL मानक के अनुसार - पंक्तियों का एक अनियंत्रित सेट। तालिका में पंक्तियाँ (या FROM
. में एक सबक्वेरी में) खंड) किसी विशिष्ट क्रम में नहीं आते हैं। इसलिए ऑप्टिमाइज़र ORDER BY
. को नज़रअंदाज़ कर सकता है खंड जो आपने निर्दिष्ट किया है। वास्तव में, SQL मानक ORDER BY
. की भी अनुमति नहीं देता है इस उपश्रेणी में प्रकट होने के लिए खंड (हम इसकी अनुमति देते हैं, क्योंकि ORDER BY ... LIMIT
... परिणाम बदलता है, पंक्तियों का सेट, न केवल उनका क्रम)।
आपको सबक्वेरी को FROM
. में ट्रीट करना होगा क्लॉज, कुछ अनिर्दिष्ट और अपरिभाषित क्रम में पंक्तियों के एक सेट के रूप में, और ORDER BY
डालें शीर्ष-स्तर पर SELECT
।
तो MariaDB भी ORDER BY
. लागू करने की अनुशंसा करती है सबसे बाहरी क्वेरी में, या LIMIT
. में यदि आवश्यक हो।
नोट:मेरे पास वर्तमान में एक उचित MySQL 5.5 या 5.6 तक पहुंच नहीं है, यह पुष्टि करने के लिए कि क्या व्यवहार समान है (और SQLFiddle.com खराब है)। मूल बग रिपोर्ट पर टिप्पणियाँ (बग नहीं के रूप में बंद) सुझाव देता है कि MySQL 5.6 शायद उसी तरह व्यवहार करता है जैसे मारियाडीबी।