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

Comment puis-je agréger efficacement les données de plusieurs colonnes sur plusieurs tables dans MySQL ?

Barbara Streisand
Libérer: 2025-01-21 11:01:09
original
705 Les gens l'ont consulté

How Can I Efficiently Aggregate Data from Multiple Columns Across Multiple Tables in MySQL?

Méthode d'agrégation efficace de données multi-tables et multi-colonnes MySQL

Dans le processus d'enrichissement d'un ensemble de résultats, il est souvent nécessaire d'intégrer les données de plusieurs tables, chaque table contenant une colonne d'intérêt spécifique. Cependant, utiliser plusieurs instructions SELECT pour y parvenir peut s'avérer fastidieux et inefficace.

Supposons que nous devions récupérer les colonnes récapitulatives de deux tables, comme indiqué dans l'exemple suivant :

<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>
Copier après la connexion

Cette approche souffre souvent du problème selon lequel seule la première colonne s'affiche correctement, tandis que les résultats des autres colonnes sont erronés.

La solution consiste à utiliser une seule instruction SELECT et une agrégation conditionnelle :

<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>
Copier après la connexion

Dans cette instruction modifiée, l'agrégation conditionnelle utilise la fonction IF() pour évaluer le modèle PAT_STATUS spécifique dans chaque ligne, en incrémentant le nombre de modèles correspondants. La fonction SUM() agrège ensuite ces décomptes pour produire l’ensemble de résultats souhaité.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal