Optimisation des requêtes SQL multi-tables et multi-colonnes
Récupérer des données de plusieurs tables présente souvent des défis, en particulier lorsqu'il faut agréger les valeurs de différentes colonnes. Un cas de support récent a mis en évidence la difficulté d'un utilisateur à compter avec précision les valeurs sur plusieurs colonnes dans deux tableaux. Leur tentative initiale, utilisant des sous-requêtes imbriquées, a donné des résultats incorrects.
La requête erronée ressemblait à ceci :
<code class="language-sql">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>
La solution réside dans l’utilisation de l’agrégation conditionnelle au sein d’une seule requête. Cette approche simplifiée calcule plusieurs colonnes en fonction de conditions spécifiées, fournissant ainsi des résultats précis. La requête améliorée est :
<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 récupère efficacement les données nécessaires, éliminant les erreurs associées à la structure d'origine trop complexe. La clé est de consolider les calculs en une seule requête bien structurée à l'aide d'instructions SUM()
conditionnelles.
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!