MySQL में कुछ इस तरह काम करना चाहिए:
SELECT a.*
FROM (
SELECT ... FROM ... ORDER BY ...
) a
UNION ALL
SELECT b.*
FROM (
SELECT ... FROM ... ORDER BY ...
) b
पंक्तियों को एक क्रम में वापस करने के लिए हम उन्हें वापस करना चाहते हैं। यानी MySQL ORDER BY
. का सम्मान करता है इनलाइन दृश्यों के अंदर खंड।
लेकिन, बिना ORDER BY
. के सबसे बाहरी क्वेरी पर क्लॉज, पंक्तियों को वापस करने का क्रम नहीं है गारंटी.
यदि हमें किसी विशेष क्रम में पंक्तियों को वापस करने की आवश्यकता है, तो हम एक ORDER BY
. शामिल कर सकते हैं सबसे बाहरी क्वेरी पर। बहुत सारे उपयोग के मामलों में, हम केवल ORDER BY
. का उपयोग कर सकते हैं परिणामों को संतुष्ट करने के लिए सबसे बाहरी क्वेरी पर।
लेकिन जब हमारे पास एक उपयोग का मामला होता है जहां हमें दूसरी क्वेरी से सभी पंक्तियों से पहले लौटाई गई पहली क्वेरी से सभी पंक्तियों की आवश्यकता होती है, तो एक विकल्प प्रत्येक प्रश्न में एक अतिरिक्त विभेदक कॉलम शामिल करना होता है। उदाहरण के लिए, जोड़ें ,'a' AS src
पहली क्वेरी में, ,'b' AS src
दूसरी क्वेरी के लिए।
तब सबसे बाहरी क्वेरी में ORDER BY src, name
. शामिल हो सकता है , परिणामों के अनुक्रम की गारंटी के लिए।
अनुसरण करें
आपकी मूल क्वेरी में, ORDER BY
आपके प्रश्नों में अनुकूलक द्वारा खारिज कर दिया गया है; चूंकि कोई ORDER BY
नहीं है बाहरी क्वेरी पर लागू, MySQL पंक्तियों को किसी भी क्रम में वापस करने के लिए स्वतंत्र है।
मेरे उत्तर (उपरोक्त) में क्वेरी में "ट्रिक" व्यवहार पर निर्भर है जो MySQL के कुछ संस्करणों के लिए विशिष्ट हो सकता है।
टेस्ट केस:
तालिकाओं को भरें
CREATE TABLE foo2 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
CREATE TABLE foo3 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
INSERT INTO foo2 (id, role) VALUES
(1,'sam'),(2,'frodo'),(3,'aragorn'),(4,'pippin'),(5,'gandalf');
INSERT INTO foo3 (id, role) VALUES
(1,'gimli'),(2,'boromir'),(3,'elron'),(4,'merry'),(5,'legolas');
क्वेरी
SELECT a.*
FROM ( SELECT s.id, s.role
FROM foo2 s
ORDER BY s.role
) a
UNION ALL
SELECT b.*
FROM ( SELECT t.id, t.role
FROM foo3 t
ORDER BY t.role
) b
परिणामसेट लौटा
id role
------ ---------
3 aragorn
2 frodo
5 gandalf
4 pippin
1 sam
2 boromir
3 elron
1 gimli
5 legolas
4 merry
foo2
. से पंक्तियां "क्रम में" लौटाए जाते हैं, उसके बाद foo3
. से पंक्तियां आती हैं , फिर से, "क्रम में"।
ध्यान दें (फिर से) कि यह व्यवहार नहीं है गारंटी. (जिस व्यवहार का हम अवलोकन करते हैं, वह इस बात का एक साइड इफेक्ट है कि MySQL इनलाइन दृश्यों (व्युत्पन्न तालिकाओं) को कैसे संसाधित करता है। यह व्यवहार 5.5 के बाद के संस्करणों में भिन्न हो सकता है।)
यदि आपको किसी विशेष क्रम में पंक्तियों को वापस करने की आवश्यकता है, तो एक ORDER BY
निर्दिष्ट करें सबसे बाहरी क्वेरी के लिए क्लॉज। और वह आदेश संपूर्ण . पर लागू होगा परिणामसेट।
जैसा कि मैंने पहले उल्लेख किया है, अगर मुझे पहले पहली क्वेरी से पंक्तियों की आवश्यकता होती है, उसके बाद दूसरी क्वेरी की, तो मैं प्रत्येक क्वेरी में एक "विभेदक" कॉलम शामिल करूंगा, और फिर ORDER BY क्लॉज में "विभेदक" कॉलम शामिल करूंगा। मैं इनलाइन दृश्यों को भी हटा दूंगा, और कुछ इस तरह करूंगा:
SELECT s.id, s.role, 's' AS src
FROM foo2 s
UNION ALL
SELECT t.id, t.role, 't' AS src
FROM foo3 t
ORDER BY src, role