2011-01-17 4 views
6

माइस्क्ल, मैं संभावित रिकॉर्ड्स की कुल संख्या प्राप्त करने के लिए SQL_CALC_FOUND_ROWS का उपयोग कर रहा हूं।
मैं इसे यूनियन पर कैसे उपयोग करूं?
जो लगता है कुछ हद तक बंद ही बात है कि मेरे लिए अभी से काम करता है,: FOUND_ROWS() documentation सेयूनियन के साथ एक क्वेरी पर मैं SQL_CALC_FOUND_ROWS को कैसे कार्यान्वित करूं?

SELECT COUNT(*) 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 

या

SELECT SQL_CALC_FOUND_ROWS * 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 
+0

आपके समाधानों में क्या गलत है? –

उत्तर

16

:

SQL_CALC_FOUND_ROWS और FOUND_ROWS के उपयोग() सरल चयन कथन के मुकाबले यूनियन कथन के लिए अधिक जटिल है, क्योंकि यूनियन में एकाधिक स्थानों पर LIMIT हो सकता है। यह यूनियन में अलग-अलग SELECT कथन, या वैश्विक रूप से पर यूनियन परिणाम के लिए लागू हो सकता है।

संघ के लिए SQL_CALC_FOUND_ROWS की मंशा है कि यह पंक्ति गिनती है कि एक वैश्विक सीमा के बिना लौटा दिया जाएगा लौट जाना है। यूनिअन साथ SQL_CALC_FOUND_ROWS के उपयोग के लिए शर्तें हैं:

  • SQL_CALC_FOUND_ROWS कीवर्ड संघ के पहले चयन पर प्रदर्शित हों।

  • FOUND_ROWS() का मान सटीक है यदि यूनियन सभी का उपयोग किया जाता है। यदि यूनियन सभी का उपयोग किए बिना, डुप्लिकेट हटाने होता है और FOUND_ROWS() का मान केवल अनुमानित है।

  • अगर कोई सीमा यूनिअन में मौजूद है, SQL_CALC_FOUND_ROWS नजरअंदाज कर दिया और है रिटर्न अस्थायी तालिका में पंक्तियों कि प्रक्रिया संघ के लिए बनाई गई है की संख्या।

+0

बस स्पष्ट करने के लिए, यह 'चुनें SQL_CALC_FOUND_ROWS * से ((टी 1 से कॉलम चुनें) यूनियन सभी (टी 2 से कॉलम चुनें)) _ut' * नहीं * 'चुनें * (से चुनें ((T1 से SQL_CALC_FOUND_ROWS कॉलम चुनें) यूनियन सभी (सेम कॉलम से चुनें टी 2)) _ut' – mpen

2

आप पहली बार SELECT केवल UNION में पर SQL_CALC_FOUND_ROWS निर्दिष्ट करना होगा; COUNT(*) का उपयोग करते समय आपको वास्तव में बाहरी SELECT क्वेरी की आवश्यकता नहीं होती है।

SELECT * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

हम तो बस लिख सकते हैं::

SELECT SQL_CALC_FOUND_ROWS * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

हम तो कहते हैं:

SELECT FOUND_ROWS(); 

यह

उदाहरण के द्वारा, मान लें कि हम निम्न LIMIT एड क्वेरी डालते हैं आपके प्रश्न में उल्लिखित बाहरी क्वेरी और जे की टिप्पणियों में कुछ ओवरहेड से बचाता है ओ Stefanelli का जवाब (हालांकि मैं पूरी तरह से आश्वस्त नहीं हूँ यह एक उल्लेखनीय अंतर होगा)।

मुझे लगता है कि इसे फिर से पुनरावृत्ति है कि इस केवल बल्कि UNION से यदि आप UNION ALL उपयोग कर रहे हैं काम करेंगे लायक है - इसका कारण यह है है पंक्ति संख्या से पहले डुप्लिकेट निकाल दिए जाते हैं गणना की जाती है, जिसका अर्थ है आप FOUND_ROWS() से एक ही परिणाम प्राप्त करेंगे जैसा कि आप करेंगे UNION ALL

संबंधित मुद्दे