Tổng lớn hơn mong đợi vì các phép nối. Hãy tưởng tượng rằng một dateoccurs nhất định trong một bản ghi track_ Nutrition và hai bản ghi track_f mỏi, sau đó tham gia sẽ làm cho dữ liệu từ bảng đầu tiên được kết hợp một lần với track_fatiguerecord đầu tiên, sau đó lại với bản ghi thứ hai. Do đó, cùng một nf_sugarsvalue sẽ được tính hai lần trong tổng. Hành vi này cũng sẽ ảnh hưởng đến mức trung bình.
Do đó, trước tiên bạn nên thực hiện các tổng hợp và chỉ sau đó thực hiện các phép nối.
Thứ hai, để đảm bảo bạn nắm bắt được tất cả dữ liệu, ngay cả khi trong một ngày nhất định không phải tất cả các bảng đều có giá trị, bạn nên sử dụng các phép nối bên ngoài đầy đủ. Điều này sẽ đảm bảo rằng mỗi bản ghi trong mỗi bảng sẽ tìm thấy cách của nó trong kết quả. Hiện tại, MySQL không hỗ trợ các phép nối bên ngoài đầy đủ như vậy, vì vậy, tôi sử dụng thêm một lựa chọn phụ để chọn tất cả các ngày khác nhau từ 4 bảng và sau đó "nối trái" chúng với dữ liệu tổng hợp khác:
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;
Lưu ý rằng bạn sẽ nhận được 0 giá trị trong một số cột khi không có dữ liệu cho ngày cụ thể đó. Nếu bạn muốn lấy NULL
thay vào đó, hãy xóa Nvl () khỏi các cột đó trong truy vấn ở trên.
Sau đó, để chuẩn hóa tất cả dữ liệu trên thang điểm 0 - 10, bạn có thể xem giá trị tối đa được tìm thấy cho từng loại giá trị và sử dụng giá trị đó cho một chuyển đổi hoặc nếu bạn biết trước phạm vi của mỗi loại, thì có lẽ tốt hơn nên sử dụng thông tin và có thể là mã trong SQL.
Tuy nhiên, có vẻ hơi kỳ lạ khi có các giá trị được kết hợp trong một biểu đồ thực sự sử dụng các tỷ lệ khác nhau. Người ta có thể dễ dàng đưa ra kết luận sai với các biểu đồ như vậy.