sql >> Databasteknik >  >> RDS >> Mysql

Konvertera MySQL Query till JSON med PHP

Summan är större än förväntat på grund av sammanfogningarna. Föreställ dig att ett visst datum inträffar i en track_nutrition-post och två track_fatigue-poster, då kommer kopplingen att göra att data från den första tabellen en gång kombineras med den första track_fatiguerecord, och sedan igen med den andra posten. Således kommer samma nf_sugarsvalue att räknas två gånger i summan. Detta beteende kommer också att påverka genomsnitten.

Du bör därför först utföra aggregeringarna och först därefter utföra sammanfogningarna.

För det andra, för att säkerställa att du fångar all data, även om för ett visst datum inte alla tabeller har värden, bör du använda fullständiga yttre kopplingar. Detta kommer att garantera att varje post i varje tabell kommer att hitta sin väg i resultatet. Nu stöder inte MySQL sådana fullständiga yttre anslutningar, så jag använder ett extra underval för att välja alla olika datum från de 4 tabellerna och sedan "vänstersammanfoga" dem med andra aggregerade 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;

Observera att du kommer att få 0-värden i några av kolumnerna när det inte finns några data för det specifika datumet. Om du föredrar att få NULL ta istället bort Nvl() från dessa kolumner i frågan ovan.

Sedan, för att normalisera all data på en skala från 0 till 10, kan du titta på det maximala värdet för varje typ av värde och använda det för en konvertering, eller om du i förväg vet vad intervallen är per typ, då är det förmodligen bättre att använda det information, och kanske koda det i SQL också.

Men det ser alltid lite konstigt ut att ha värden kombinerade i en graf som faktiskt använde olika skalor. Man kan lätt dra felaktiga slutsatser med sådana grafer.



  1. JMeter - Skicka FLERA värden från 1 JDBC till en annan JDBC

  2. PARSE() vs TRY_PARSE() i SQL Server:Vad är skillnaden?

  3. Ingen OQGraph i min MariaDB?

  4. php:snabbaste sättet att generera ett 5-siffrigt nummer som inte redan finns i MySQL db-kolumnen (med ett unikt attribut)