> 데이터 베이스 > MySQL 튜토리얼 > 내 LEFT JOIN 및 GROUP_CONCAT이 중복된 결과를 생성하는 이유는 무엇입니까?

내 LEFT JOIN 및 GROUP_CONCAT이 중복된 결과를 생성하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-18 06:13:11
원래의
329명이 탐색했습니다.

Why Are My LEFT JOINs and GROUP_CONCAT Producing Duplicate Results?

LEFT JOIN 및 GROUP_CONCAT의 중복 데이터 문제 해결

각 사용자의 상위 태그와 카테고리를 수집하기 위해 LEFT JOINs, GROUP BYGROUP_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 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿