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

Konverter MySQL Query til JSON ved hjælp af PHP

Summen er større end forventet på grund af sammenføjningerne. Forestil dig, at en bestemt dato forekommer i én track_nutrition record og to track_fatigue records, så vil joinforbindelsen gøre, at dataene fra den første tabel én gang kombineres med den første track_fatiguerecord, og derefter igen med den anden record. Således vil den samme nf_sugarsvalue blive talt to gange i summen. Denne adfærd vil også påvirke gennemsnittet.

Du bør derfor først udføre aggregeringerne, og først derefter udføre joins.

For det andet, for at sikre at du fanger alle data, selvom for en bestemt dato ikke alle tabeller har værdier, bør du bruge fulde ydre joinforbindelser. Dette vil garantere, at hver post i hver tabel vil finde vej i resultatet. Nu understøtter MySQL ikke sådanne fulde ydre sammenføjninger, så jeg bruger et ekstra undervalg til at vælge alle forskellige datoer fra de 4 tabeller og derefter "venstre sammenføje" dem med de andre aggregerede data:

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;

Bemærk, at du vil få 0-værdier i nogle af kolonnerne, når der ikke er data for den pågældende dato. Hvis du foretrækker at få NULL fjern i stedet Nvl() fra disse kolonner i forespørgslen ovenfor.

Derefter, for at normalisere alle data på en 0 - 10 skala, kan du se på det maksimalt fundne for hver type værdi og bruge det til en konvertering, eller hvis du på forhånd ved, hvad intervallerne er pr. type, så er det nok bedre at bruge det information, og måske også kode det i SQL.

Det ser dog altid lidt mærkeligt ud at have værdier kombineret i en graf, der faktisk brugte forskellige skalaer. Man kan let springe til forkerte konklusioner med sådanne grafer.



  1. Vælg for opdatering spring låst fra JPA-niveau

  2. Hvordan kontrollerer man, om den aktuelle række er den sidst valgte række i en sql-forespørgsel?

  3. Hvis jeg bruger IN-operatoren til at filtrere NULL-værdier og mellemrum Det virker ikke Hvorfor?

  4. FindByUUID() ved hjælp af Spring Data's JPA Repository