Rumah > pangkalan data > tutorial mysql > Mengapa Saya LEFT JOIN dan GROUP_CONCAT Menghasilkan Keputusan Pendua?

Mengapa Saya LEFT JOIN dan GROUP_CONCAT Menghasilkan Keputusan Pendua?

Susan Sarandon
Lepaskan: 2025-01-18 06:13:11
asal
284 orang telah melayarinya

Why Are My LEFT JOINs and GROUP_CONCAT Producing Duplicate Results?

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

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

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!

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