Summan är större än förväntat på grund av sammanfogningarna. Föreställ dig att ett visst datum inträffar i en track_nutrition-post och två track_fatigue-poster, då kommer kopplingen att göra att data från den första tabellen en gång kombineras med den första track_fatiguerecord, och sedan igen med den andra posten. Således kommer samma nf_sugarsvalue att räknas två gånger i summan. Detta beteende kommer också att påverka genomsnitten.
Du bör därför först utföra aggregeringarna och först därefter utföra sammanfogningarna.
För det andra, för att säkerställa att du fångar all data, även om för ett visst datum inte alla tabeller har värden, bör du använda fullständiga yttre kopplingar. Detta kommer att garantera att varje post i varje tabell kommer att hitta sin väg i resultatet. Nu stöder inte MySQL sådana fullständiga yttre anslutningar, så jag använder ett extra underval för att välja alla olika datum från de 4 tabellerna och sedan "vänstersammanfoga" dem med andra aggregerade data:
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;
Observera att du kommer att få 0-värden i några av kolumnerna när det inte finns några data för det specifika datumet. Om du föredrar att få NULL
ta istället bort Nvl() från dessa kolumner i frågan ovan.
Sedan, för att normalisera all data på en skala från 0 till 10, kan du titta på det maximala värdet för varje typ av värde och använda det för en konvertering, eller om du i förväg vet vad intervallen är per typ, då är det förmodligen bättre att använda det information, och kanske koda det i SQL också.
Men det ser alltid lite konstigt ut att ha värden kombinerade i en graf som faktiskt använde olika skalor. Man kan lätt dra felaktiga slutsatser med sådana grafer.