जब आप mysql ORDER BY
के साथ संयोजन में उपयोग की जाने वाली उप क्वेरी के अंदर एक क्लॉज का उपयोग करते हैं, तो वह क्लॉज UNION
को अनुकूलित कर देगा ORDER BY
।
ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से UNION
रिटर्न एक अनियंत्रित सूची है इसलिए ORDER BY
कुछ भी नहीं करेगा।
अनुकूलन का उल्लेख डॉक्स में किया गया है और कहता है:
किसी व्यक्ति के चयन के द्वारा आदेश या सीमा लागू करने के लिए, कोष्ठक के अंदर खंड रखें जो चयन को संलग्न करता है:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
हालाँकि, व्यक्तिगत चयन के लिए ORDER BY के उपयोग से तात्पर्य उस क्रम के बारे में कुछ भी नहीं है जिसमें पंक्तियाँ अंतिम परिणाम में दिखाई देती हैं क्योंकि UNION डिफ़ॉल्ट रूप से पंक्तियों के अनियंत्रित सेट का उत्पादन करता है। इसलिए, इस संदर्भ में ORDER BY का उपयोग आम तौर पर LIMIT के साथ संयोजन के रूप में किया जाता है, ताकि इसका चयन SELECT को प्राप्त करने के लिए चयनित पंक्तियों के सबसेट को निर्धारित करने के लिए किया जाए, भले ही यह जरूरी न हो कि उन पंक्तियों के क्रम को प्रभावित न करें। अंतिम यूनिअन परिणाम। यदि ORDER BY किसी SELECT में LIMIT के बिना दिखाई देता है, तो इसे ऑप्टिमाइज़ किया जाता है क्योंकि इसका वैसे भी कोई प्रभाव नहीं होगा।
इसका अंतिम वाक्य थोड़ा भ्रामक है क्योंकि इसका प्रभाव होना चाहिए। यह अनुकूलन समस्या का कारण बनता है जब आप एक ऐसी स्थिति में होते हैं जहां आपको उप-क्षेत्र के भीतर ऑर्डर करने की आवश्यकता होती है।
MySQL को इस ऑप्टिमाइज़ेशन को न करने के लिए मजबूर करने के लिए आप एक लिमिट क्लॉज़ को जोड़ सकते हैं:
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
एक उच्च का LIMIT
मतलब है कि आप OFFSET
समग्र क्वेरी पर जोड़ सकते हैं यदि आप कुछ ऐसा करना चाहते हैं जैसे पृष्ठ पर अंक लगाना।
यह आपको ORDER BY
प्रत्येक संघ के लिए अलग-अलग कॉलम में सक्षम होने का अतिरिक्त लाभ भी देता है ।