Jumlahnya lebih besar dari yang diharapkan karena gabungan. Bayangkan bahwa suatu tanggal tertentu terjadi dalam satu record_track_nutrition dan dua record_track_fatigue, maka penggabungan akan membuat data dari tabel pertama digabungkan dengan record_track_fatigue pertama, dan kemudian lagi dengan record kedua. Jadi nilai nf_sugars yang sama akan dihitung dua kali dalam penjumlahan. Perilaku ini juga akan mempengaruhi rata-rata.
Oleh karena itu, Anda harus terlebih dahulu melakukan agregasi, dan baru kemudian melakukan penggabungan.
Kedua, untuk memastikan Anda menangkap semua data, bahkan jika untuk tanggal tertentu tidak semua tabel memiliki nilai, Anda harus menggunakan gabungan luar penuh. Ini akan menjamin bahwa setiap record di setiap tabel akan menemukan jalannya di hasil. Sekarang, MySQL tidak mendukung gabungan luar penuh seperti itu, jadi saya menggunakan sub-pilihan tambahan untuk memilih semua tanggal yang berbeda dari 4 tabel dan kemudian "menggabungkan kiri" dengan data agregat lainnya:
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;
Perhatikan bahwa Anda akan mendapatkan 0 nilai di beberapa kolom ketika tidak ada data untuk tanggal tertentu. Jika Anda lebih suka mendapatkan NULL
sebagai gantinya, hapus Nvl() dari kolom tersebut dalam kueri di atas.
Kemudian, untuk menormalkan semua data pada skala 0 - 10, Anda dapat melihat nilai maksimum yang ditemukan untuk setiap jenis nilai dan menggunakannya untuk konversi, atau jika Anda mengetahui sebelumnya kisaran per jenis, maka mungkin lebih baik menggunakan itu informasi, dan mungkin kode itu di SQL juga.
Namun, selalu terlihat agak aneh memiliki nilai yang digabungkan dalam grafik yang sebenarnya menggunakan skala yang berbeda. Orang mungkin dengan mudah mengambil kesimpulan yang salah dengan grafik seperti itu.