Meringkaskan Data daripada Pelbagai Lajur dalam MySQL dengan cekap
Bekerja dengan pangkalan data hubungan selalunya memerlukan data pengagregatan yang tersebar merentas berbilang lajur dalam jadual yang berbeza. Hanya menggabungkan beberapa pertanyaan boleh membawa kepada hasil yang tidak tepat. Contoh ini menunjukkan masalah biasa dan penyelesaiannya yang cekap menggunakan MySQL.
Pertimbangkan pertanyaan MySQL awal ini yang direka untuk meringkaskan data pesakit daripada jadual t_hospital
:
<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>
Masalahnya: Hanya arr
(mengira DAY_IN
) menghasilkan keputusan yang betul. ONG1
, RTED
, POLI
dan para
(mengira kejadian bagi nilai PAT_STATUS
yang berbeza) adalah tidak tepat disebabkan penggabungan pertanyaan berasingan yang tidak betul.
Penyelesaian: Menggunakan fungsi agregat MySQL (SUM
dan IF
) dalam satu pertanyaan menyediakan penyelesaian yang lebih cekap dan tepat:
<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>
Pertanyaan yang disemak ini mengagregatkan data dengan betul untuk setiap DAY_IN
, memberikan kiraan yang tepat untuk setiap kategori PAT_STATUS
dalam satu pertanyaan yang cekap. Pendekatan ini mengelakkan produk Cartesian dan mengakibatkan ketidaktepatan pertanyaan asal.
Atas ialah kandungan terperinci Bagaimana untuk Mengumpul Data dengan Cekap daripada Pelbagai Lajur Merentasi Jadual Berbeza dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!