Effizientes Zusammenfassen von Daten aus mehreren Spalten in MySQL
Bei der Arbeit mit relationalen Datenbanken müssen häufig Daten aggregiert werden, die über mehrere Spalten in verschiedenen Tabellen verteilt sind. Die einfache Verkettung mehrerer Abfragen kann zu ungenauen Ergebnissen führen. Dieses Beispiel zeigt ein häufiges Problem und seine effiziente Lösung mit MySQL.
Betrachten Sie diese erste MySQL-Abfrage, die dazu dient, Patientendaten aus der t_hospital
-Tabelle zusammenzufassen:
<code class="language-sql">SET @start_res = 20150301; SET @finish_res= 20150501; SET @finish_check= 20150801; SET @start_check= 20150301; SET @daily_hos= 3; 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>
Das Problem: Nur arr
(Zählen DAY_IN
) liefert korrekte Ergebnisse. ONG1
, RTED
, POLI
und para
(Zählen des Vorkommens verschiedener PAT_STATUS
-Werte) sind aufgrund der falschen Verknüpfung separater Abfragen ungenau.
Die Lösung: Die Verwendung der Aggregatfunktionen von MySQL (SUM
und IF
) innerhalb einer einzigen Abfrage bietet eine viel effizientere und genauere Lösung:
<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>
Diese überarbeitete Abfrage aggregiert die Daten für jede DAY_IN
korrekt und liefert genaue Zählungen für jede PAT_STATUS
-Kategorie in einer einzigen, effizienten Abfrage. Dieser Ansatz vermeidet das kartesische Produkt und die daraus resultierenden Ungenauigkeiten der ursprünglichen Abfrage.
Das obige ist der detaillierte Inhalt vonWie können Daten aus mehreren Spalten in verschiedenen Tabellen in MySQL effizient aggregiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!