왼쪽 조인에서 조인된 행 수를 카운트하는 중
테이블의 지정된 레코드에 조인된 모든 레코드의 개수를 반환하는 집계 쿼리를 SQL에 작성하려고 합니다. 지정된 레코드에 조인된 레코드가 없는 경우 해당 레코드의 결과는 다음과 같습니다.0
:
데이터.
내 데이터베이스는 다음과 같습니다(아쉽게도 구조를 변경할 수 없습니다).
MESSAGE
----------------------------------------------
MESSAGEID SENDER SUBJECT
----------------------------------------------
1 Tim Rabbit of Caerbannog
2 Bridgekeeper Bridge of Death
MESSAGEPART
----------------------------------------------
MESSAGEID PARTNO CONTENT
----------------------------------------------
1 0 (BLOB)
1 1 (BLOB)
3 0 (BLOB)
(MESSAGEPART
컴포지트가 있다PRIMARY KEY("MESSAGEID", "PARTNO")
)
바람직한 출력
위의 데이터를 고려하면 다음과 같은 정보를 얻을 수 있습니다.
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 0
왼쪽 조인을 해야 할 것 같아서MESSAGE
테이블입니다만, 이 카운트를 반환할 수 있을까요?0
결합된 열이 있는 행의 경우MESSAGEPART
이다NULL
다음을 시도했습니다.
논리
해봤어요
SELECT m.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
단, 이것은 반환됩니다.
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 1
나도 해봤어
SELECT mp.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY mp.MESSAGEID;
하지만 이것은 다시 돌아온다
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
1
내가 여기서 뭘 잘못하고 있는 거지?
이런 건 어때?
SELECT m.MESSAGEID, sum((case when mp.messageid is not null then 1 else 0 end)) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
COUNT() 함수는 null인 경우에도 모든 행을 카운트합니다.SUM() 및 CASE를 사용하면 null 이외의 값만 카운트할 수 있습니다.
편집: 톱 코멘트에서 가져온 간단한 버전:
SELECT m.MESSAGEID, COUNT(mp.MESSAGEID) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
가입하기 전에 먼저 구세주 테이블에서 숫자를 세고 싶으시겠죠?이것을 시험해 보세요.
SELECT m.MessageId
, COALESCE(c, 0) as myCount
FROM MESSAGE m
LEFT JOIN (SELECT MESSAGEID
, count(*) c
FROM MESSAGEPART
GROUP BY MESSAGEID) mp
ON mp.MESSAGEID = m.MESSAGEID
두 개 이상의 테이블에 참여할 경우 DISTINT를 사용하는 것을 잊지 마십시오.
SELECT m.MESSAGEID, COUNT(DISTINCT mp.MESSAGEID) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
일치하는 열을 기준으로 두 테이블 간의 일치 요소 합계로 하나의 숫자 반환
제 경우, 특정 컬럼과 두 개의 다른 테이블에서 일치하는 항목 수/카운트에 대해 총 1개의 번호가 반환되어야 했습니다.
예를 들어, 각각 Phone Number 컬럼이 있는2개의 테이블이 있습니다.그 두 표 중에서 그 열의 몇 개가 일치하는지 알고 싶습니다.
참고 자료: https://www.guru99.com/joins.html
위의 동일한 테이블 이름을 사용하면 다음과 같습니다.
SELECT COUNT(DISTINCT m.MESSAGEID) AS COUNT FROM MESSAGE m, MESSAGEPART mp
where mp.MESSAGEID = m.MESSAGEID;
언급URL : https://stackoverflow.com/questions/20119901/counting-number-of-joined-rows-in-left-join
'source' 카테고리의 다른 글
Woocommerce의 Linked Product에서 커스텀 필드를 추가하는 방법 (0) | 2023.02.28 |
---|---|
리액트 라우터의 hashHistory와 browserHistory의 차이점은 무엇입니까? (0) | 2023.02.28 |
Spring Boot에서 다양한 데이터베이스 구성을 제공하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
Angular.js를 사용하여 페이지 번호 매기기/테이블 레이아웃을 구현하는 방법 (0) | 2023.02.23 |
Yooman과 Bower가 부트스트랩 CSS를 추가하지 않음(각도)JS 제너레이터) (0) | 2023.02.23 |