Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengelakkan Hasil SUM Berganda Apabila Menyertai Jadual dalam 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:
<code class="language-sql">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;</code>
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!