> 데이터 베이스 > MySQL 튜토리얼 > 내 SQL COUNT(*)가 ID 및 포스터별로 그룹화하는 대신 모든 행을 집계하는 이유는 무엇입니까?

내 SQL COUNT(*)가 ID 및 포스터별로 그룹화하는 대신 모든 행을 집계하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-18 05:46:13
원래의
264명이 탐색했습니다.

Why is My SQL COUNT(*) Aggregating All Rows Instead of Grouping by ID and Poster?

*SQL COUNT() 잘못된 행 집계: 일반적인 함정**

SQL 쿼리에서 자주 발생하는 문제는 COUNT(*) 집계 함수가 의도한 그룹화를 수행하는 대신 예기치 않게 모든 행을 계산하는 것과 관련이 있습니다. 이는 GROUP BY

을 잘못 배치하거나 생략하여 발생하는 경우가 많습니다.

문제가 있는 쿼리와 해결 방법을 살펴보겠습니다.

원래 쿼리는 "포스터" 및 "ID"로 그룹화된 "Aura" 상태를 기준으로 행 수를 계산하는 것을 목표로 했습니다.

<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`,0) as `Aura`
FROM (
    SELECT * FROM (
        SELECT DISTINCT * FROM messages m
        INNER JOIN
        (
            SELECT Friend2 as Friend FROM friends WHERE Friend1 = '1'
            UNION ALL
            SELECT Friend1 as Friend FROM friends WHERE Friend2 = '1'
        ) friends ON m.Poster = friends.`Friend`
        UNION ALL SELECT DISTINCT *, '1' FROM messages where `Poster`='1'
    ) var
    LEFT JOIN
    (
        select `ID` as `AuraID`, `Status` as `AuraStatus`, count(*) as `Aura`
            from messages_aura
    ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)
) final

GROUP BY `ID`, `Poster`
ORDER BY `Time` DESC LIMIT 10</code>
로그인 후 복사

"포스터" 및 "ID" 조합당 "Aura" 발생 횟수(예: ID 1, 2 Aura 인스턴스가 있는 포스터 2)라는 예상 결과가 달성되지 않았습니다. 하위 쿼리의 COUNT(*) 함수가 messages_aura.

의 모든 행을 잘못 집계했습니다.

해결책: GROUP BY

으로 올바른 그룹화

문제는 GROUP BY과 결합된 하위 쿼리에 messages_aura 절이 없다는 것입니다. 수정된 쿼리는 다음과 같습니다.

<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`,0) as `Aura`
FROM (
    SELECT * FROM (
        SELECT DISTINCT * FROM messages m
        INNER JOIN
        (
            SELECT Friend2 as Friend FROM friends WHERE Friend1 = '1'
            UNION ALL
            SELECT Friend1 as Friend FROM friends WHERE Friend2 = '1'
        ) friends ON m.Poster = friends.`Friend`
        UNION ALL SELECT DISTINCT *, '1' FROM messages where `Poster`='1'
    ) var
    LEFT JOIN
    (
        select `ID` as `AuraID`, `Status` as `AuraStatus`, count(*) as `Aura`
        from messages_aura
        GROUP BY AuraID, AuraStatus  -- The crucial addition
    ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)
) final

GROUP BY `ID`, `Poster`
ORDER BY `Time` DESC LIMIT 10</code>
로그인 후 복사

GROUP BY AuraID, AuraStatus 내부 SELECT 문에 COUNT(*)를 추가하면 이제 AuraID 함수가 AuraStatusAura의 각 고유 조합에 대한 행을 올바르게 계산하여 원하는 그룹화된 결과를 생성합니다. 이렇게 하면 GROUP BY이 행 수준에서 정확하게 계산됩니다. 그런 다음 외부 ID 절은 Poster

을 기반으로 결과를 추가로 집계합니다.

위 내용은 내 SQL COUNT(*)가 ID 및 포스터별로 그룹화하는 대신 모든 행을 집계하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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