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

MySQL - कुशलतापूर्वक LIMIT के साथ दो चुनिंदा कथनों को एक परिणाम में संयोजित करना

आप कई प्रश्नों को UNION के साथ जोड़ सकते हैं , लेकिन केवल तभी जब प्रश्नों में स्तंभों की संख्या समान हो। आदर्श रूप से कॉलम समान होते हैं, न केवल डेटा प्रकार में, बल्कि उनके अर्थ अर्थ में भी; हालाँकि, MySQL शब्दार्थ की परवाह नहीं करता है और कुछ और सामान्य चीज़ों को कास्ट करके अलग-अलग डेटाटाइप को संभालेगा - इसलिए यदि आवश्यक हो तो आप कर सकते हैं प्रत्येक तालिका से अलग-अलग अर्थ रखने के लिए स्तंभों को अधिभारित करें, फिर निर्धारित करें कि आपके उच्च स्तरीय कोड में कौन सा अर्थ उपयुक्त है (हालांकि मैं इसे इस तरह से करने की अनुशंसा नहीं करता)।

जब स्तंभों की संख्या भिन्न होती है, या जब आप दो प्रश्नों से डेटा का बेहतर/कम अतिभारित संरेखण प्राप्त करना चाहते हैं, तो आप अपने SELECT में डमी शाब्दिक कॉलम सम्मिलित कर सकते हैं बयान। उदाहरण के लिए:

SELECT t.cola, t.colb, NULL, t.colc, NULL FROM t;

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

  SELECT a, b, c, d, NULL AS e, NULL AS f, NULL AS g FROM t1
UNION ALL -- specify ALL because default is DISTINCT, which is wasted here
  SELECT NULL, NULL, NULL, NULL, a, b, c FROM t2;

आप अपने दो प्रश्नों को इस तरह से संरेखित करने का प्रयास कर सकते हैं, फिर उन्हें एक UNION . के साथ जोड़ सकते हैं ऑपरेटर; LIMIT applying लागू करके UNION . के लिए , आप अपने लक्ष्य को प्राप्त करने के करीब हैं:

  (SELECT ...)
UNION
  (SELECT ...)
LIMIT 10;

एकमात्र मुद्दा जो बचा हुआ है, जैसा कि ऊपर प्रस्तुत किया गया है, पहली तालिका के 10 या अधिक रिकॉर्ड दूसरे से किसी भी रिकॉर्ड को "बाहर" कर देंगे। हालांकि, हम ORDER BY . का उपयोग कर सकते हैं इसे हल करने के लिए बाहरी क्वेरी में।

यह सब एक साथ रखना:

(
  SELECT
    dr.request_time AS event_time, m.member_name,      -- shared columns
    dr.request_id, dr.member1, dr.member2,             -- request-only columns
    NULL AS alert_id, NULL AS alerter_id,              -- alert-only columns
      NULL AS alertee_id, NULL AS type
  FROM dating_requests dr JOIN members m ON dr.member1=m.member_id 
  WHERE dr.member2=:loggedin_id
  ORDER BY event_time LIMIT 10 -- save ourselves performing excessive UNION
) UNION ALL (
  SELECT
    da.alert_time AS event_time, m.member_name,        -- shared columns
    NULL, NULL, NULL,                                  -- request-only columns
    da.alert_id, da.alerter_id, da.alertee_id, da.type -- alert-only columns
  FROM
    dating_alerts da
    JOIN dating_alerts_status das USING (alert_id, alertee_id)
    JOIN members m ON da.alerter_id=m.member_id
  WHERE
    da.alertee_id=:loggedin_id
    AND da.type='platonic'
    AND das.viewed='0'
    AND das.viewed_time<da.alert_time
  ORDER BY event_time LIMIT 10 -- save ourselves performing excessive UNION
)
ORDER BY event_time
LIMIT 10;

बेशक, अब यह आपको तय करना है कि आप किस प्रकार की पंक्ति का सामना कर रहे हैं जब आप परिणामसेट में प्रत्येक रिकॉर्ड को पढ़ते हैं (सुझाव है कि आप request_id का परीक्षण करें। और/या alert_id NULL . के लिए मूल्य; वैकल्पिक रूप से कोई भी परिणामों में एक अतिरिक्त कॉलम जोड़ सकता है जो स्पष्ट रूप से बताता है कि प्रत्येक रिकॉर्ड किस तालिका से उत्पन्न हुआ है, लेकिन यह समकक्ष होना चाहिए बशर्ते वे id हों कॉलम हैं NOT NULL )।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रेल 5 मैसकल यूयूआईडी

  2. MySQL संग्रहित प्रक्रियाएं चयन के साथ काम नहीं कर रही हैं (मूल प्रश्न)

  3. osx पर jdbc का उपयोग करके जावा को mysql से कनेक्ट करें

  4. मॉड रीराइट, टाइटल स्लग और htaccess

  5. एक MySQL तालिका को हटा नहीं सकता। (त्रुटि 1050)