sql >> Base de Datos >  >> RDS >> Mysql

Convierta MySQL Query en JSON usando PHP

La suma es mayor de lo esperado debido a las uniones. Imagine que ocurre una fecha determinada en un registro track_nutrition y dos registros track_fatigue, luego la combinación hará que los datos de la primera tabla se combinen una vez con el primer registro track_fatigue y luego nuevamente con el segundo registro. Por lo tanto, el mismo nf_sugarsvalue se contará dos veces en la suma. Este comportamiento también afectará los promedios.

Por lo tanto, primero debe realizar las agregaciones y solo luego realizar las uniones.

En segundo lugar, para asegurarse de capturar todos los datos, incluso si para una fecha determinada no todas las tablas tienen valores, debe utilizar uniones externas completas. Esto garantizará que cada registro en cada tabla encuentre su camino en el resultado. Ahora, MySQL no admite dichas uniones externas completas, por lo que utilizo una subselección adicional para seleccionar todas las fechas diferentes de las 4 tablas y luego las "uní a la izquierda" con los otros datos agregados:

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;

Tenga en cuenta que obtendrá valores 0 en algunas de las columnas cuando no haya datos para esa fecha en particular. Si prefiere obtener NULL en su lugar, elimine Nvl() de esas columnas en la consulta anterior.

Luego, para normalizar todos los datos en una escala de 0 a 10, puede mirar el máximo encontrado para cada tipo de valor y usarlo para una conversión, o si sabe de antemano cuáles son los rangos por tipo, entonces probablemente sea mejor usar eso. información, y tal vez codifique eso en el SQL también.

Sin embargo, siempre parece un poco extraño tener valores combinados en un gráfico que en realidad usa diferentes escalas. Uno podría saltar fácilmente a conclusiones erróneas con tales gráficos.