Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

UNION के अंदर ORDER BY का उपयोग कैसे करें

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Typo3 V6:सामग्री तत्व कंटेनर कैसे बनाएं? (टीवी के बिना)

  2. एक mysqli तैयार बयान में नल का उपयोग करना

  3. हाइबरनेट- भूमिका के संग्रह को आलसी रूप से प्रारंभ करने में विफल:सेम। भाषा। रोगी, प्रॉक्सी प्रारंभ नहीं कर सका - कोई सत्र नहीं

  4. माईएसक्यूएल ग्रुप बाय काउंट

  5. MySQL सबक्वेरी एक से अधिक पंक्तियों को लौटाता है