आप कई प्रश्नों को 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
)।