다중 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
효과적인 솔루션
이러한 중복을 방지할 수 있는 방법은 다음과 같습니다.
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 JOIN
의 user_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!