Maison >base de données >tutoriel mysql >Comment agréger efficacement les données de plusieurs colonnes sur différentes tables dans 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!