對 LEFT JOIN 和 GROUP_CONCAT 中的重複資料進行故障排除
您的查詢使用 LEFT JOINs
、GROUP BY
和 GROUP_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 JOIN
和 GROUP 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中文網其他相關文章!