आप aggregate fanout issue
का सामना कर रहे हैं . ऐसा तब होता है जब किसी चयनित क्वेरी में प्राथमिक तालिका में उस द्वितीयक तालिका की तुलना में कम पंक्तियाँ होती हैं जिससे वह जुड़ी होती है। शामिल होने का परिणाम डुप्लिकेट पंक्तियों में होता है। इसलिए, जब कुल कार्य लागू होते हैं, तो वे अतिरिक्त पंक्तियों पर कार्य करते हैं।
यहां प्राथमिक तालिका उस तालिका को संदर्भित करती है जहां कुल कार्य लागू होते हैं। आपके उदाहरण में,
* SUM(matters.fee)
>> टेबल पर एकत्रीकरण matters
.
* SUM(advicetime*advicefee)
>> टेबल पर एकत्रीकरण actions
* fixedfee='Y'
>> जहां टेबल पर स्थिति matters
फैनआउट समस्या से बचने के लिए:
* हमेशा एक जॉइन में सबसे दानेदार टेबल पर एग्रीगेट लागू करें।
* जब तक कि दो टेबल में एक-से-एक संबंध न हो, तब तक से फ़ील्ड पर एग्रीगेट फ़ंक्शन लागू न करें। दोनों टेबल।
* अलग-अलग सबक्वेरी के ज़रिए अलग-अलग अपने एग्रीगेट प्राप्त करें और फिर परिणाम को संयोजित करें। यह एक SQL कथन में किया जा सकता है, या आप डेटा निर्यात कर सकते हैं और फिर कर सकते हैं।
प्रश्न 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
प्रश्न 2:
SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y'
Query 1
&Query 2
फैनआउट से पीड़ित न हों। इस बिंदु पर आप उन दोनों को निर्यात कर सकते हैं और परिणाम को php. या आप उन्हें SQL में संयोजित कर सकते हैं:
SELECT query_2.totbills, query_1.totfixed
FROM (SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y') query_1,
(SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y') query_2
अंत में, SUM
कोई कीवर्ड नहीं लेता DISTINCT
. DISTINCT
केवल COUNT
. के लिए उपलब्ध है और GROUP_CONCAT
कुल कार्य। निम्नलिखित अमान्य SQL का एक भाग है
SUM(DISTINCT matters.fee) AS totfixed