Mysql
 sql >> база данни >  >> RDS >> Mysql

Конвертирайте MySQL Query в JSON с помощта на PHP

Сумата е по-голяма от очакваната поради присъединяванията. Представете си, че дадена дата се среща в един запис track_nutrition и два записа track_fatigue, след което съединението ще направи така, че данните от първата таблица да се комбинират веднъж с първия запис track_fatiguerecord и след това отново с втория запис. Така една и съща nf_sugarsvalue ще бъде отчетена два пъти в сумата. Това поведение също ще повлияе на средните стойности.

Следователно първо трябва да извършите агрегациите и едва след това да извършите обединенията.

Второ, за да сте сигурни, че улавяте всички данни, дори ако за определена дата не всички таблици имат стойности, трябва да използвате пълни външни съединения. Това ще гарантира, че всеки запис във всяка таблица ще намери своето място в резултата. Сега MySQL не поддържа такива пълни външни обединения, така че използвам допълнителен подизбор, за да избера всички различни дати от 4-те таблици и след това да ги „съединя отляво“ с другите обобщени данни:

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;

Имайте предвид, че ще получите 0 стойности в някои от колоните, когато няма данни за тази конкретна дата. Ако предпочитате да получите NULL вместо това премахнете Nvl() от тези колони в горната заявка.

След това, за да нормализирате всички данни по скала от 0 до 10, можете да погледнете максималната намерена стойност за всеки тип стойност и да я използвате за преобразуване, или ако знаете предварително какви са диапазоните за тип, вероятно е по-добре да използвате това информация и може би кодирайте това и в SQL.

Въпреки това, винаги изглежда малко странно да има комбинирани стойности в графика, която всъщност използва различни мащаби. Човек лесно може да направи погрешни заключения с такива графики.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не мога да стартирам MySQL сървъра от командния ред в Windows

  2. Изберете продукти по множество атрибути, като използвате И вместо ИЛИ конкатенатор, модел на данни EAV

  3. Вземете броя на редовете в таблица A, които имат препратка към таблица B

  4. как да изпращам поща от mysql с помощта на съхранени процедури?

  5. Дублирана колона при присъединяване