Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengumpul Berbilang Kiraan dengan Cekap daripada Lajur Berbeza dalam Jadual MySQL yang Sama?

Bagaimana untuk Mengumpul Berbilang Kiraan dengan Cekap daripada Lajur Berbeza dalam Jadual MySQL yang Sama?

Linda Hamilton
Linda Hamiltonasal
2025-01-21 11:06:09969semak imbas

How to Efficiently Aggregate Multiple Counts from Different Columns in the Same MySQL Table?

MySQL: Mengagregatkan Kiraan Merentasi Berbilang Lajur dengan Cekap dalam Satu Jadual

Berbilang pertanyaan menyasarkan jadual yang sama tetapi lajur yang berbeza dalam MySQL boleh membawa kepada pengambilan data yang tidak cekap dan hasil yang tidak tepat. Mari kita ilustrasikan ini dengan contoh dan tunjukkan pendekatan yang betul.

Andaikan anda perlu mengira kiraan berdasarkan pelbagai kriteria dalam jadual t_hospital:

Kaedah Tidak Cekap (Berbilang Pertanyaan):

Kod berikut cuba mencapai ini menggunakan berbilang pertanyaan, tetapi ia menghasilkan hasil yang salah untuk lajur melebihi yang pertama:

<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>

Kaedah Cekap (Pertanyaan Tunggal dengan Pengagregatan Bersyarat):

Penyelesaian optimum melibatkan satu pertanyaan yang menggunakan 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>

Pendekatan ini menggunakan fungsi IF() untuk mengira kejadian secara bersyarat berdasarkan nilai PAT_STATUS dan SUM() mengagregatkan kiraan ini untuk setiap DAY_IN. Kaedah ini jauh lebih cekap dan memberikan hasil yang tepat. Ia mengelakkan produk Cartesian yang dicipta secara tersirat dengan menyertai berbilang subkueri.

Atas ialah kandungan terperinci Bagaimana untuk Mengumpul Berbilang Kiraan dengan Cekap daripada Lajur Berbeza dalam Jadual MySQL yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn