Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengumpul Data dengan Cekap daripada Pelbagai Lajur Merentasi Jadual Berbeza dalam MySQL?

Bagaimana untuk Mengumpul Data dengan Cekap daripada Pelbagai Lajur Merentasi Jadual Berbeza dalam MySQL?

Barbara Streisand
Lepaskan: 2025-01-21 10:56:10
asal
595 orang telah melayarinya

How to Efficiently Aggregate Data from Multiple Columns Across Different Tables in MySQL?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan