MySQL: Effizientes Aggregieren von Zählungen über mehrere Spalten in einer einzigen Tabelle
Mehrere Abfragen, die auf dieselbe Tabelle, aber unterschiedliche Spalten in MySQL abzielen, können zu ineffizientem Datenabruf und ungenauen Ergebnissen führen. Lassen Sie uns dies anhand eines Beispiels veranschaulichen und die richtige Vorgehensweise zeigen.
Angenommen, Sie müssen die Anzahl anhand verschiedener Kriterien in der t_hospital
Tabelle berechnen:
Ineffiziente Methode (mehrere Abfragen):
Der folgende Code versucht, dies mithilfe mehrerer Abfragen zu erreichen, erzeugt jedoch falsche Ergebnisse für Spalten, die über die erste hinausgehen:
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;
Effiziente Methode (Einzelabfrage mit bedingter Aggregation):
Die optimale Lösung umfasst eine einzelne Abfrage mit bedingter Aggregation:
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;
Dieser Ansatz nutzt die Funktion IF()
, um Vorkommnisse basierend auf PAT_STATUS
-Werten bedingt zu zählen, und SUM()
aggregiert diese Zählungen für jeden DAY_IN
. Diese Methode ist deutlich effizienter und liefert genaue Ergebnisse. Es vermeidet das kartesische Produkt, das implizit durch die Verknüpfung mehrerer Unterabfragen erstellt wird.
Das obige ist der detaillierte Inhalt vonWie kann man mehrere Zählungen aus verschiedenen Spalten in derselben MySQL-Tabelle effizient aggregieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!