*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
함수가 AuraStatus
및 Aura
의 각 고유 조합에 대한 행을 올바르게 계산하여 원하는 그룹화된 결과를 생성합니다. 이렇게 하면 GROUP BY
이 행 수준에서 정확하게 계산됩니다. 그런 다음 외부 ID
절은 Poster
및
위 내용은 내 SQL COUNT(*)가 ID 및 포스터별로 그룹화하는 대신 모든 행을 집계하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!