본문 바로가기
MySql

MySQL - JOIN only if a row exists from the left table

by 베이스 공부 2021. 1. 14.
반응형

다음은 MySQL입니다.

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        COUNT(b.id) tickets_bought 
FROM current_lotteries a
   JOIN lottery_tickets b ON b.lid=a.id
WHERE a.cid=1 
ORDER BY started DESC LIMIT 1    

검색에서 a 에 행이 없지만 b 에 행이있는 경우 (예 : COUNT (b.id) NULL )이 쿼리는 a 필드에 대한 NULL 값과 COUNT (b.id) 를 구매 한 티켓 으로 표시합니다. a 테이블에 결과가없는 경우 행 ( num_rows = 0 )을 반환하지 않도록이 쿼리를 수정하려면 어떻게해야합니까?

스냅.

쿼리

 

해결 방법

 

GROUP BY 절이 없으면 MySQL (다른 RDBMS에서 오류가 발생할 경우이를 허용 함)은 그룹화해야 할 때 b 의 모든 행에 집계 그룹을 적용합니다. 그들. GROUP BY a.id 추가

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        COUNT(b.id) tickets_bought 
FROM current_lotteries a
   JOIN lottery_tickets b ON b.lid=a.id
WHERE a.cid=1 
GROUP BY a.id
ORDER BY started DESC LIMIT 1    

위의 내용은 MySQL에서 작동하지만 다른 곳에서는 작동하지 않습니다. 더 이식 가능한 버전은 상관 하위 쿼리를 사용합니다.

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1

 

참조 페이지 https://stackoverflow.com/questions/14182609

 

 

반응형

댓글