首頁 > 資料庫 > mysql教程 > 為什麼我的 LEFT JOIN 和 GROUP_CONCAT 會產生重複的結果?

為什麼我的 LEFT JOIN 和 GROUP_CONCAT 會產生重複的結果?

Susan Sarandon
發布: 2025-01-18 06:13:11
原創
284 人瀏覽過

Why Are My LEFT JOINs and GROUP_CONCAT Producing Duplicate Results?

對 LEFT JOIN 和 GROUP_CONCAT 中的重複資料進行故障排除

您的查詢使用 LEFT JOINsGROUP BYGROUP_CONCAT 收集每個使用者的熱門標籤和類別,意外地產生了重複條目。

了解重複問題

問題源自於多個LEFT JOINs在使用者、標籤和類別之間建立多對多關係。 這會導致每個使用者產生多行,每行代表不同的標籤類別組合。 然後,GROUP BY 聚合這些內容,從而產生 GROUP_CONCAT 中的重複項。

解:使用 DISTINCT 和 GROUP_CONCAT

要消除重複項,請在 DISTINCT 函數中新增 GROUP_CONCAT 關鍵字。這可確保僅連接唯一的標籤和類別:

<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>
登入後複製

替代方案:用於清潔聚合的子查詢

另一種策略完全避免 LEFT JOINGROUP BY 組合。 使用子查詢(或用於更複雜場景的 CTE)提供了更受控制的聚合:

<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>
登入後複製

此方法確保每個使用者獨立進行聚合,從而防止早期重複。 選擇最適合您的資料庫結構和查詢複雜性的方法。

以上是為什麼我的 LEFT JOIN 和 GROUP_CONCAT 會產生重複的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板