Menggabungkan SUM()
pengiraan dengan gabungan jadual berbilang dalam MySQL memerlukan pertimbangan yang teliti untuk mengelakkan keputusan yang tidak tepat. Perangkap biasa timbul daripada kesan produk Cartesian semasa cantuman, yang membawa kepada jumlah yang melambung.
Masalahnya: Hasil SUM() Melambung
Seorang pengguna cuba menyatukan dua pertanyaan, setiap satu mengira jumlah daripada jadual berbeza, menjadi satu pertanyaan gabungan.
Pertanyaan 1 (Perbatuan): Menjumlahkan masa memandu (dalam minit) seminggu, dikumpulkan mengikut guru.
<code class="language-sql">SELECT last_name, first_name, ..., SUM(drive_time) AS MINUTES FROM bhds_mileage ... WHERE mil_date BETWEEN ... AND ... GROUP BY ...</code>
Pertanyaan 2 (Kad Masa): Menjumlahkan jumlah jam setiap minggu, dikumpulkan mengikut guru.
<code class="language-sql">SELECT last_name, first_name, ..., SUM(tm_hours) AS total FROM bhds_timecard ... WHERE tm_date BETWEEN ... AND ... GROUP BY ...</code>
Gagal Menyertai Percubaan:
Percubaan pengguna untuk menggabungkan pertanyaan ini secara langsung mengakibatkan jumlah yang salah:
<code class="language-sql">SELECT last_name, first_name, ..., SUM(tm_hours) AS total, SUM(drive_time) AS MINUTES FROM bhds_timecard ... LEFT JOIN bhds_mileage ... ON ... WHERE ... GROUP BY ...</code>
Isunya? Fungsi SUM()
telah digunakan selepas cantuman, membawa kepada pendaraban jumlah kerana potensi untuk berbilang baris padanan antara jadual yang dicantumkan.
Penyelesaian: Subkueri Pra-agregat
Pendekatan yang betul melibatkan pra-mengagregatkan jumlah dalam subkueri sebelum menyertai:
<code class="language-sql">SELECT last_name, first_name, ..., total, minutes FROM bhds_teachers ... LEFT JOIN ( -- Subquery 1: Mileage SUM SELECT teacher_id, SUM(drive_time) AS minutes, ... FROM bhds_mileage ... WHERE mil_date BETWEEN ... AND ... GROUP BY teacher_id ) AS m ON ... LEFT JOIN ( -- Subquery 2: Timecard SUM SELECT teacher_id, SUM(tm_hours) AS total, ... FROM bhds_timecard ... WHERE tm_date BETWEEN ... AND ... GROUP BY teacher_id ) AS t ON ...</code>
Dengan melakukan operasi SUM()
dalam subkueri berasingan, kami memastikan bahawa setiap data jadual diagregatkan dengan betul sebelum cantuman berlaku, menghalang pendaraban jumlah dan menghasilkan keputusan yang tepat. teacher_id
(atau setara) adalah penting untuk keadaan cantum yang betul.
Atas ialah kandungan terperinci Mengapakah Keputusan SUM() MySQL Saya Tidak Betul Apabila Menyertai Berbilang Jadual?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!