Maison >base de données >tutoriel mysql >Comment agréger efficacement les données de plusieurs colonnes sur différentes tables dans MySQL ?

Comment agréger efficacement les données de plusieurs colonnes sur différentes tables dans MySQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-21 10:56:10598parcourir

How to Efficiently Aggregate Data from Multiple Columns Across Different Tables in MySQL?

Résumer efficacement les données de plusieurs colonnes dans MySQL

Travailler avec des bases de données relationnelles nécessite souvent d'agréger des données réparties sur plusieurs colonnes dans différentes tables. La simple concaténation de plusieurs requêtes peut conduire à des résultats inexacts. Cet exemple montre un problème courant et sa solution efficace à l'aide de MySQL.

Considérez cette requête MySQL initiale conçue pour résumer les données des patients de la table t_hospital :

<code class="language-sql">SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT* from
   ( SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )e,
     (SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE PAT_STATUS  like '%ong%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN ) a,
        (SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE PAT_STATUS  like '%rtde%'and  DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )b,
           (SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE PAT_STATUS  like '%pol%'and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN   )c,
              (SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE PAT_STATUS  like '%para%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )d;</code>

Le problème : seul arr (en comptant DAY_IN) produit des résultats corrects. ONG1, RTED, POLI et para (en comptant les occurrences de différentes valeurs PAT_STATUS) sont inexacts en raison de la jointure incorrecte de requêtes distinctes.

La solution : l'utilisation des fonctions d'agrégation de MySQL (SUM et IF) au sein d'une seule requête fournit une solution beaucoup plus efficace et précise :

<code class="language-sql">SELECT DAY_IN, COUNT(*) AS arr,
        SUM(IF(PAT_STATUS  like '%ong%', 1, 0)) AS ONG1,
        SUM(IF(PAT_STATUS  like '%rtde%', 1, 0)) AS RTED,
        SUM(IF(PAT_STATUS  like '%pol%', 1, 0)) AS POL1,
        SUM(IF(PAT_STATUS  like '%para%', 1, 0)) AS para
FROM t_hospital 
WHERE DAY_IN between @start_check and @finish_check 
    and RES_DATE between @start_res and @finish_res  
    and ID_daily_hos =@daily_hos
GROUP BY DAY_IN;</code>

Cette requête révisée regroupe correctement les données pour chaque DAY_IN, fournissant des décomptes précis pour chaque PAT_STATUS catégorie au sein d'une requête unique et efficace. Cette approche évite le produit cartésien et les inexactitudes qui en résultent de la requête originale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn