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
Barbara StreisandOriginal
2025-01-21 11:01:09707Durchsuche

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:

<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>

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:

<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>

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!

Stellungnahme:
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