Heim > Datenbank > MySQL-Tutorial > Wie kann ich Daten aus mehreren Spalten in mehreren Tabellen in MySQL effizient aggregieren?

Wie kann ich Daten aus mehreren Spalten in mehreren Tabellen in MySQL effizient aggregieren?

Barbara Streisand
Freigeben: 2025-01-21 11:01:09
Original
726 Leute haben es durchsucht

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

Mehrtabellen- und mehrspaltige dateneffiziente MySQL-Aggregationsmethode

Beim Anreichern einer Ergebnismenge ist es oft notwendig, Daten aus mehreren Tabellen zu integrieren, wobei jede Tabelle eine bestimmte Spalte von Interesse enthält. Die Verwendung mehrerer SELECT-Anweisungen zu diesem Zweck kann jedoch mühsam und ineffizient sein.

Angenommen, wir müssen Zusammenfassungsspalten aus zwei Tabellen abrufen, wie im folgenden Beispiel gezeigt:

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
Nach dem Login kopieren

Bei diesem Ansatz besteht häufig das Problem, dass nur die erste Spalte korrekt angezeigt wird, während die Ergebnisse für die anderen Spalten falsch sind.

Die Lösung besteht darin, eine einzige SELECT-Anweisung und bedingte Aggregation zu verwenden:

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
Nach dem Login kopieren

In dieser modifizierten Anweisung verwendet die bedingte Aggregation die Funktion IF(), um das spezifische PAT_STATUS-Muster in jeder Zeile auszuwerten und die Anzahl der übereinstimmenden Muster zu erhöhen. Die SUM()-Funktion aggregiert dann diese Zählungen, um die gewünschte Ergebnismenge zu erzeugen.

Das obige ist der detaillierte Inhalt vonWie kann ich Daten aus mehreren Spalten in mehreren Tabellen in MySQL effizient aggregieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage