LEFT JOIN 및 GROUP_CONCAT의 중복 데이터 문제 해결
각 사용자의 상위 태그와 카테고리를 수집하기 위해 LEFT JOINs
, GROUP BY
및 GROUP_CONCAT
을 사용하는 쿼리에서 예기치 않게 중복된 항목이 생성되었습니다.
중복 문제 이해
문제는 사용자, 태그 및 카테고리 간에 다대다 관계를 생성하는 여러 LEFT JOINs
에서 발생합니다. 이로 인해 각 사용자에 대해 여러 행이 생성되며, 각 행은 서로 다른 태그-범주 조합을 나타냅니다. 그런 다음 GROUP BY
는 이를 집계하여 GROUP_CONCAT
내의 중복된 항목으로 이어집니다.
해결책: GROUP_CONCAT과 함께 DISTINCT 사용
중복을 제거하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!