Rumah > pangkalan data > tutorial mysql > Mengapakah Keputusan SUM() MySQL Saya Tidak Betul Apabila Menyertai Berbilang Jadual?

Mengapakah Keputusan SUM() MySQL Saya Tidak Betul Apabila Menyertai Berbilang Jadual?

Patricia Arquette
Lepaskan: 2025-01-19 14:21:09
asal
676 orang telah melayarinya

Why Are My MySQL SUM() Results Incorrect When Joining Multiple Tables?

MySQL SUM() dan Gabungan Berbilang Jadual: Mengelakkan Pengagregatan yang Salah

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

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

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

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

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!

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