> 데이터 베이스 > MySQL 튜토리얼 > 여러 `GROUP_BY`를 결합할 때 `GROUP_CONCAT`에서 중복을 방지하는 방법은 무엇입니까?

여러 `GROUP_BY`를 결합할 때 `GROUP_CONCAT`에서 중복을 방지하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-18 06:16:09
원래의
307명이 탐색했습니다.

How to Avoid Duplicates in `GROUP_CONCAT` When Joining Multiple `GROUP_BY`s?

다중 GROUP_CONCAT 조인을 사용하여 GROUP BY에서 중복 결과 처리

GROUP BY을 통해 여러 LEFT JOIN 절을 결합하고 GROUP_CONCAT을 사용하면 항목이 중복될 수 있습니다. 이는 각 GROUP BY의 고유 키를 병합하여 발생하며, 이로 인해 데이터 표현이 부정확해집니다.

문제 시나리오

다음 쿼리 구조를 고려해보세요.

<code class="language-sql">SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, 
    SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags,
    SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
FROM
    (...) AS q1
    LEFT JOIN (...) AS q2 ON q2.user_id = q1.user_id 
    LEFT JOIN (...) AS q3 ON q3.user_id = q1.user_id 
GROUP BY
    q1.user_id, q1.user_name, q1.score, q1.reputation</code>
로그인 후 복사

이 쿼리는 사용자, 태그, 평판, post_tag, 카테고리 및 post_category에 대한 테이블을 가정하여 각 사용자에 대한 상위 2개의 태그와 카테고리를 검색하는 것을 목표로 합니다. 문제는 결합된 GROUP BY

으로 인해 "css,css" 또는 "technology,technology"와 같은 중복이 발생할 가능성이 있다는 것입니다.

효과적인 솔루션

이러한 중복을 방지할 수 있는 방법은 다음과 같습니다.

1. GROUP BY과 INNER JOIN을 분리하세요:

<code class="language-sql">-- Separate grouping and joining approach
SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, q1.top_two_tags, q2.category
FROM
    (SELECT
        q1.user_id, q1.user_name, q1.score, q1.reputation, 
        SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q2 ON q2.user_id = q1.user_id 
    GROUP BY
        q1.user_id, q1.user_name, q1.score, q1.reputation
    ) AS q1
    INNER JOIN
    (SELECT
        q1.user_id, 
        SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q3 ON q3.user_id = q1.user_id 
    GROUP BY
        q1.user_id
    ) AS q2
    ON q1.user_id = q2.user_id;</code>
로그인 후 복사

이 방법은 먼저 태그와 카테고리를 별도로 그룹화하고 연결한 다음 INNER JOINuser_id을 사용하여 결과를 결합합니다. 이렇게 하면 사용자당 하나의 행만 생성됩니다.

2. 스칼라 하위 쿼리:

<code class="language-sql">-- Scalar subquery approach
SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation,
    (SELECT
        SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2)
    FROM (...) AS q2
    WHERE q2.user_id = q1.user_id
    ),
    (SELECT
        SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2)
    FROM (...) AS q3
    WHERE q3.user_id = q1.user_id
    )
FROM
    (...) AS q1;</code>
로그인 후 복사

SELECT 목록 내의 하위 쿼리를 사용하여 GROUP BY 모호함을 방지하면서 각 사용자의 상위 태그와 카테고리를 개별적으로 가져옵니다.

핵심은 여러 테이블에서 GROUP_CONCAT를 사용할 때 단일 GROUP BY 호출 내에서 여러 조인된 테이블의 데이터를 직접 연결하지 않는 것입니다. 선택한 솔루션은 특정 데이터베이스 구조 및 성능 고려 사항에 따라 달라집니다. 목표는 정확하고 중복 없는 결과를 생성하는 것입니다.

위 내용은 여러 `GROUP_BY`를 결합할 때 `GROUP_CONCAT`에서 중복을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿