Menyelesaikan Masalah Data Duplikat daripada LEFT JOINs dan GROUP_CONCAT
Pertanyaan anda, yang menggunakan LEFT JOINs
, GROUP BY
dan GROUP_CONCAT
untuk mengumpulkan teg dan kategori teratas bagi setiap pengguna, secara tidak dijangka menghasilkan entri pendua.
Memahami Isu Penduaan
Masalahnya berpunca daripada berbilang LEFT JOINs
mewujudkan perhubungan banyak-ke-banyak antara pengguna, teg dan kategori. Ini menghasilkan berbilang baris untuk setiap pengguna, setiap satu mewakili gabungan kategori teg yang berbeza. GROUP BY
kemudian mengagregatkan ini, membawa kepada item pendua dalam GROUP_CONCAT
.
Penyelesaian: Menggunakan DISTINCT dengan GROUP_CONCAT
Untuk menghapuskan pendua, tambahkan kata kunci DISTINCT
dalam fungsi GROUP_CONCAT
anda. Ini memastikan hanya tag dan kategori unik digabungkan:
<code class="language-sql">SELECT q1.user_id, q1.user_name, q1.score, q1.reputation, SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags, SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category FROM ...</code>
Alternatif: Subkueri untuk Pengagregatan Lebih Bersih
Strategi alternatif mengelakkan gabungan LEFT JOIN
dan GROUP BY
sama sekali. Menggunakan subkueri (atau CTE untuk senario yang lebih kompleks) menyediakan pengagregatan yang lebih terkawal:
<code class="language-sql">SELECT u.user_id, u.user_name, u.score, u.reputation, (SELECT GROUP_CONCAT(tag ORDER BY tag_reputation DESC SEPARATOR ',') FROM post_tag WHERE user_id = u.user_id LIMIT 2) AS top_two_tags, (SELECT GROUP_CONCAT(category ORDER BY category_reputation DESC SEPARATOR ',') FROM post_category WHERE category_id = u.category_id LIMIT 2) AS category FROM users u</code>
Kaedah ini memastikan pengagregatan berlaku secara bebas untuk setiap pengguna, menghalang pertindihan lebih awal. Pilih pendekatan yang paling sesuai dengan struktur pangkalan data dan kerumitan pertanyaan anda.
Atas ialah kandungan terperinci Mengapa Saya LEFT JOIN dan GROUP_CONCAT Menghasilkan Keputusan Pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!