योग जुड़ने के कारण अपेक्षा से बड़ा है। कल्पना कीजिए कि एक ट्रैक_न्यूट्रिशन रिकॉर्ड और दो ट्रैक_फैटीग रिकॉर्ड में एक निश्चित तारीख होती है, फिर जॉइन यह बना देगा कि पहली टेबल के डेटा को एक बार पहले ट्रैक_फैटीग्यूरेकॉर्ड के साथ जोड़ा जाता है, और फिर दूसरे रिकॉर्ड के साथ। इस प्रकार वही nf_sugarsvalue योग में दो बार गिना जाएगा। यह व्यवहार औसत को भी प्रभावित करेगा।
इसलिए आपको पहले एग्रीगेशन करना चाहिए, और उसके बाद ही जॉइन करना चाहिए।
दूसरे, यह सुनिश्चित करने के लिए कि आप सभी डेटा को पकड़ लें, भले ही किसी निश्चित तिथि के लिए सभी तालिकाओं में मान न हों, आपको पूर्ण बाहरी जुड़ाव का उपयोग करना चाहिए। यह गारंटी देगा कि प्रत्येक तालिका में प्रत्येक रिकॉर्ड परिणाम में अपना रास्ता खोज लेगा। अब, MySQL इस तरह के पूर्ण बाहरी जुड़ाव का समर्थन नहीं करता है, इसलिए मैं 4 तालिकाओं से सभी अलग-अलग तिथियों का चयन करने के लिए एक अतिरिक्त उप-चयन का उपयोग करता हूं और फिर उन्हें अन्य समेकित डेटा के साथ "बाएं शामिल" करता हूं:
SELECT dates.date,
IFNULL(average_ticnum_n, 0) as average_ticnum
IFNULL(average_fatiguenum_n, 0) as average_fatiguenum
IFNULL(average_stressnum_n, 0) as average_stressnum
IFNULL(sum_nf_sugars_n, 0) as sum_nf_sugars
IFNULL(sum_nf_total_carbohydrate_n, 0) as sum_nf_total_carbohydrate
FROM (
SELECT DISTINCT user_id,
date
FROM (
SELECT user_id,
date
FROM track_ticseverity
UNION
SELECT user_id,
date
FROM track_fatigue
UNION
SELECT user_id,
date
FROM track_stress
UNION
SELECT user_id,
date
FROM track_nutrition
) as combined
) as dates
LEFT JOIN (
SELECT user_id,
date,
AVG(ticnum) as average_ticnum_n
FROM track_ticseverity
GROUP BY user_id,
date) as grp_ticseverity
ON dates.date = grp_ticseverity.date
AND dates.user_id = grp_ticseverity.user_id
LEFT JOIN (
SELECT user_id,
date,
AVG(fatiguenum) as average_fatiguenum_n
FROM track_fatigue
GROUP BY user_id,
date) as grp_fatigue
ON dates.date = grp_fatigue.date
AND dates.user_id = grp_fatigue.user_id
LEFT JOIN (
SELECT user_id,
date,
AVG(stressnum) as average_stressnum_n
FROM track_stress
GROUP BY user_id,
date) as grp_stress
ON dates.date = grp_stress.date
AND dates.user_id = grp_stress.user_id
LEFT JOIN (
SELECT user_id,
date,
SUM(nf_sugars) as sum_nf_sugars_n,
SUM(nf_total_carbohydrate) as sum_nf_total_carbohydrate_n
FROM track_nutrition
GROUP BY user_id,
date) as grp_nutrition
ON dates.date = grp_nutrition.date
AND dates.user_id = grp_nutrition.user_id
WHERE dates.user_id = 1
ORDER BY dates.date;
ध्यान दें कि उस विशेष तिथि के लिए कोई डेटा नहीं होने पर आपको कुछ कॉलम में 0 मान मिलेंगे। यदि आप NULL
प्राप्त करना पसंद करते हैं इसके बजाय, उपरोक्त क्वेरी में उन कॉलम से Nvl() को हटा दें।
फिर, 0 - 10 पैमाने पर सभी डेटा को सामान्य करने के लिए, आप प्रत्येक प्रकार के मूल्य के लिए अधिकतम पाया जा सकता है और रूपांतरण के लिए इसका उपयोग कर सकते हैं, या यदि आप पहले से जानते हैं कि श्रेणियां प्रति प्रकार क्या हैं, तो शायद इसका उपयोग करना बेहतर है जानकारी, और शायद कोड जो SQL में भी हो।
हालांकि, यह हमेशा थोड़ा अजीब लगता है कि मूल्यों को एक ग्राफ में जोड़ा जाता है जो वास्तव में अलग-अलग पैमानों का उपयोग करता है। ऐसे रेखांकन के साथ कोई भी आसानी से गलत निष्कर्ष पर पहुंच सकता है।