Mysql
 sql >> Database >  >> RDS >> Mysql

Converti MySQL Query in JSON usando PHP

La somma è maggiore del previsto a causa dei join. Immagina che una certa data si verifichi in un record track_nutrition e due record track_fatigue, quindi il join farà in modo che i dati della prima tabella vengano combinati una volta con il primo track_fatiguerecord e poi di nuovo con il secondo record. Quindi lo stesso nf_sugarsvalue verrà contato due volte nella somma. Questo comportamento influenzerà anche le medie.

Dovresti quindi eseguire prima le aggregazioni e solo successivamente i join.

In secondo luogo, per assicurarti di catturare tutti i dati, anche se per una determinata data non tutte le tabelle hanno valori, dovresti utilizzare i full outer join. Ciò garantirà che ogni record in ogni tabella troverà la sua strada nel risultato. Ora, MySQL non supporta tali join esterni completi, quindi utilizzo una sottoselezione aggiuntiva per selezionare tutte le diverse date dalle 4 tabelle e quindi "unirle a sinistra" con gli altri dati aggregati:

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;

Nota che otterrai 0 valori in alcune colonne quando non ci sono dati per quella data particolare. Se preferisci ottenere NULL rimuovi invece Nvl() da quelle colonne nella query sopra.

Quindi, per normalizzare tutti i dati su una scala da 0 a 10, puoi guardare il massimo trovato per ogni tipo di valore e usarlo per una conversione, o se sai in anticipo quali sono gli intervalli per tipo, probabilmente è meglio usarlo informazioni, e magari anche codificarle in SQL.

Tuttavia, sembra sempre un po' strano avere valori combinati in un grafico che utilizza effettivamente scale diverse. Si potrebbe facilmente saltare a conclusioni sbagliate con tali grafici.