Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengelakkan Hasil SUM Berganda Apabila Menyertai Jadual dalam MySQL?

Bagaimanakah Saya Boleh Mengelakkan Hasil SUM Berganda Apabila Menyertai Jadual dalam MySQL?

Linda Hamilton
Lepaskan: 2025-01-19 14:32:09
asal
1021 orang telah melayarinya

How Can I Avoid Multiplied SUM Results When Joining Tables in MySQL?

Mengelakkan Keputusan SUM Berganda dalam MySQL Joins

MySQL bergabung, apabila digabungkan dengan agregasi SUM, selalunya menghasilkan hasil yang tidak tepat dan melambung akibat kesan produk Cartesian. Gabungan berbilang boleh menyebabkan pertindihan baris, meningkatkan nilai SUM. Penyelesaiannya adalah dengan pra-agregat data menggunakan subkueri.

Strategi Berkesan: Subkueri untuk Pengagregatan Tepat

Untuk mengelakkan SUM melambung, lakukan pengagregatan sebelum mencantumkan jadual. Ini dicapai melalui subkueri yang mengumpulkan dan menjumlahkan data secara bebas, kemudian menyertai hasil agregat.

Contoh Pertanyaan dan Penjelasan:

Pertanyaan ini menunjukkan cara untuk menyertai jadual dengan betul semasa menggunakan pengagregatan SUM:

SELECT 
    i.last_name, 
    i.first_name, 
    DATE_FORMAT(LEAST(m.mil_date, t.tm_date), '%m/%d/%y') AS dates, 
    t.total, 
    m.minutes
FROM 
    bhds_teachers AS i
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(mil_date) AS week, 
        MIN(mil_date) AS mil_date, 
        SUM(drive_time) AS minutes
    FROM 
        bhds_mileage
    WHERE 
        mil_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS m ON m.ds_id = i.ds_id
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(tm_date) AS week, 
        MIN(tm_date) AS tm_date, 
        SUM(tm_hours) AS total
    FROM 
        bhds_timecard
    WHERE 
        tm_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS t ON t.ds_id = i.ds_id AND t.week = m.week;
Salin selepas log masuk

Subkueri (m dan t) secara bebas mengira jumlah untuk drive_time dan tm_hours, masing-masing, mengumpulkan mengikut ds_id dan week. Hasil agregat ini kemudiannya digabungkan dengan bhds_teachers (disebut sebagai i) menggunakan nombor ds_id dan week yang sepadan. LEAST() memilih tarikh terawal daripada dua jadual teragregat. Kaedah ini mengelakkan masalah pendaraban yang wujud dalam bergabung sebelum menjumlahkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelakkan Hasil SUM Berganda Apabila Menyertai Jadual dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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