चूँकि ये तीनों समुच्चय एक ही तालिका से समान WHERE
के साथ आते हैं शर्तें, आपको उप-चयनों की कोई आवश्यकता नहीं है। सभी तीन समुच्चय एक ही पंक्ति समूह पर काम कर रहे हैं (कोई GROUP BY
. नहीं निर्दिष्ट, इसलिए पूरी तालिका के लिए एक पंक्ति), ताकि वे सभी SELECT
. में मौजूद हो सकें सीधे सूची।
SELECT
SUM(number) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
यदि किसी भी समुच्चय को विभिन्न स्थितियों पर आधारित होने की आवश्यकता है तो आप WHERE
. में फ़िल्टर करेंगे क्लॉज, तो आपको अलग-अलग स्थिति के लिए या तो उप-चयन का उपयोग करना होगा, या कार्टेशियन जॉइन करना होगा। यह उप-चयन और निम्न LEFT JOIN
विधि समतुल्य होनी चाहिए, केवल एक पंक्ति लौटाने वाले समुच्चय के लिए प्रदर्शन-वार:
SELECT
/* Unique filtering condition - must be done in a subselect */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
या उपरोक्त क्वेरी के समकक्ष, आप LEFT JOIN
एक सबक्वेरी के खिलाफ बिना ON
खंड . यह केवल उन स्थितियों में किया जाना चाहिए जब आप जानते हैं कि सबक्वेरी केवल एक पंक्ति लौटाएगी। अन्यथा, आप एक कार्टेशियन उत्पाद के साथ समाप्त हो जाएंगे - जितनी पंक्तियाँ शामिल होने के एक तरफ गुणा द्वारा लौटाई जाती हैं दूसरी तरफ से लौटाई गई पंक्तियों की संख्या।
यह आसान है अगर आपको WHERE
. के एक सेट के साथ कुछ कॉलम वापस करने की आवश्यकता है क्लॉज की स्थिति और WHERE
. के एक अलग सेट के साथ कुछ कॉलम शर्तें, लेकिन केवल एक JOIN
. के हर तरफ से पंक्ति . इस मामले में, यह JOIN
करने के लिए तेज़ होना चाहिए करने के बजाय दो समान WHERE
. के साथ उप-चयन करता है खंड।
यह तेज़ होना चाहिए....
SELECT
/* this one has two aggregates sharing a WHERE condition */
subq.number_sum_filtered,
subq.number_max_filtered,
/* ...and two aggregates on the main table with no WHERE clause filtering */
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`
LEFT JOIN (
SELECT
SUM(number) AS number_sum_filtered,
MAX(number) AS number_max_filtered
FROM `table`
WHERE `somecolumn = `somevalue`
) subq /* No ON clause here since there's no common column to join on... */
इससे भी...
SELECT
/* Two different subselects each over the same filtered set */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered,
(SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered,
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`