>데이터 베이스 >MySQL 튜토리얼 >내 SQL COUNT(*)가 개별 행 개수 대신 합계를 반환하는 이유는 무엇입니까?

내 SQL COUNT(*)가 개별 행 개수 대신 합계를 반환하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-18 05:41:09921검색

Why Does My SQL COUNT(*) Return the Total Instead of Individual Row Counts?

SQL 쿼리는 개별 행 개수가 아닌 총 행 개수를 반환합니다

SQL 쿼리를 실행할 때 잘못된 결과를 방지하려면 COUNT(*)와 같은 집계 함수를 올바르게 사용해야 합니다. 다음 문장을 고려해보세요:

<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura`
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)
GROUP BY `ID`, `Poster`
ORDER BY `Time` DESC
LIMIT 10;</code>

이 쿼리의 목표는 messagesmessages_aura 테이블의 데이터를 쿼리하고 각 사용자에 대한 Aura 메시지 발생 횟수를 계산하는 것입니다. 그러나 문제는 LEFT JOIN 절이 누락된 GROUP BY 하위 쿼리에 있습니다.

문제: GROUP BY 절이 없으면 하위 쿼리는 각 사용자의 수를 계산하는 대신 모든 사용자의 총 Aura 메시지 수를 반환합니다. 결과적으로 관련 열별로 그룹화하는 대신 모든 행을 집계하므로 출력에 잘못된 개수가 표시됩니다.

해결책: 이 문제를 해결하려면 GROUP BY 하위 쿼리에 LEFT JOIN 절을 추가해야 합니다.

<code class="language-sql">LEFT JOIN
(
    SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura`
    FROM messages_aura
    GROUP BY AuraID, AuraStatus
) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)</code>

GROUP BY AuraID, AuraStatus을 추가하면 이제 하위 쿼리가 해당 열을 기준으로 결과를 그룹화하여 각 사용자의 아우라 수가 정확하도록 보장합니다.

위 내용은 내 SQL COUNT(*)가 개별 행 개수 대신 합계를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.