Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ubah Query MySQL menjadi JSON menggunakan PHP

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Salin item dari treeview tkinter

  2. gunakan pencarian teks lengkap untuk mencari kata-kata yang tidak lengkap di mysql

  3. Periksa apakah nama pengguna sudah ada dengan MySQLi

  4. Bagaimana cara menyelesaikan terowongan SSH ini dari buruh pelabuhan pengembangan lokal ke basis data pementasan?

  5. mysql_fetch_array() mengharapkan parameter 1 menjadi sumber daya, string diberikan