Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengagregat Data dengan Cekap daripada Pelbagai Lajur Merentasi Pelbagai Jadual dalam MySQL?

Bagaimanakah Saya Boleh Mengagregat Data dengan Cekap daripada Pelbagai Lajur Merentasi Pelbagai Jadual dalam MySQL?

Barbara Streisand
Barbara Streisandasal
2025-01-21 11:01:09656semak imbas

How Can I Efficiently Aggregate Data from Multiple Columns Across Multiple Tables in 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!

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