Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengagregat Data dengan Cekap daripada Pelbagai Lajur Merentasi Pelbagai Jadual dalam MySQL?
Kaedah pengagregatan data yang cekap berbilang jadual dan berbilang lajur MySQL
Dalam proses memperkayakan set hasil, selalunya perlu untuk menyepadukan data daripada berbilang jadual, setiap jadual mengandungi lajur tertentu yang diminati. Walau bagaimanapun, menggunakan berbilang pernyataan SELECT untuk mencapai ini boleh membosankan dan tidak cekap.
Andaikan kita perlu mendapatkan semula lajur ringkasan daripada dua jadual seperti yang ditunjukkan dalam contoh berikut:
<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>
Pendekatan ini sering mengalami masalah bahawa hanya lajur pertama dipaparkan dengan betul, manakala keputusan untuk lajur lain adalah salah.
Penyelesaian adalah dengan menggunakan pernyataan SELECT tunggal dan pengagregatan bersyarat:
<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>
Dalam pernyataan yang diubah suai ini, pengagregatan bersyarat menggunakan fungsi IF() untuk menilai corak PAT_STATUS tertentu dalam setiap baris, menambah kiraan corak padanan. Fungsi SUM() kemudiannya mengagregatkan kiraan ini untuk menghasilkan set hasil yang diingini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengagregat Data dengan Cekap daripada Pelbagai Lajur Merentasi Pelbagai Jadual dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!