source

왼쪽 조인에서 조인된 행 수를 카운트하는 중

gigabyte 2023. 2. 23. 22:52
반응형

왼쪽 조인에서 조인된 행 수를 카운트하는 중

테이블의 지정된 레코드에 조인된 모든 레코드의 개수를 반환하는 집계 쿼리를 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

반응형