Summen er større end forventet på grund af sammenføjningerne. Forestil dig, at en bestemt dato forekommer i én track_nutrition record og to track_fatigue records, så vil joinforbindelsen gøre, at dataene fra den første tabel én gang kombineres med den første track_fatiguerecord, og derefter igen med den anden record. Således vil den samme nf_sugarsvalue blive talt to gange i summen. Denne adfærd vil også påvirke gennemsnittet.
Du bør derfor først udføre aggregeringerne, og først derefter udføre joins.
For det andet, for at sikre at du fanger alle data, selvom for en bestemt dato ikke alle tabeller har værdier, bør du bruge fulde ydre joinforbindelser. Dette vil garantere, at hver post i hver tabel vil finde vej i resultatet. Nu understøtter MySQL ikke sådanne fulde ydre sammenføjninger, så jeg bruger et ekstra undervalg til at vælge alle forskellige datoer fra de 4 tabeller og derefter "venstre sammenføje" dem med de andre aggregerede 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;
Bemærk, at du vil få 0-værdier i nogle af kolonnerne, når der ikke er data for den pågældende dato. Hvis du foretrækker at få NULL
fjern i stedet Nvl() fra disse kolonner i forespørgslen ovenfor.
Derefter, for at normalisere alle data på en 0 - 10 skala, kan du se på det maksimalt fundne for hver type værdi og bruge det til en konvertering, eller hvis du på forhånd ved, hvad intervallerne er pr. type, så er det nok bedre at bruge det information, og måske også kode det i SQL.
Det ser dog altid lidt mærkeligt ud at have værdier kombineret i en graf, der faktisk brugte forskellige skalaer. Man kan let springe til forkerte konklusioner med sådanne grafer.