Heim >Datenbank >MySQL-Tutorial >Wie kann ich Daten aus mehreren Spalten in mehreren Tabellen in MySQL effizient aggregieren?
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!