Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chuyển đổi truy vấn MySQL thành JSON bằng PHP

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem tên người dùng đã tồn tại bằng PHP chưa

  2. Trích xuất các trường MySQL của hàng thành các biến và mảng PHP

  3. Mysql:di chuyển các bản ghi cụ thể lên đầu mảng kết quả bên cạnh ORDER BY

  4. Gọi thủ tục lưu trữ MySQL bằng VB6 với tham số OUT

  5. Hiệu suất khóa mức hàng InnoDB - bao nhiêu hàng?