mysql 두 테이블을 join 후 count를 가져오고싶습니다.ㅠㅠ 0 5 5,213

by 보들윤 [SQL Query] mysql join count [2022.09.02 17:20:29]


[상품 테이블]과 해당 상품의 [후기 작성 테이블]을 조회하여,

현재 쿼리를 실행하는(로그인한 회원을 의미) 회원이 상품에 몇개의 후기를 작성했고,

앞으로 몇개의 상품에 후기를 작성할 수 있는지 구하고 싶습니다.

 

[item_table]

it_id it_name item_price
11111111 바나나 10000
22222222 키위 20000
33333333 사과 5000
44444444 오렌지 5000

 

[item_use_table]

is_id(autoincrement) it_id mb_id(회원아이디)
1 11111111 member
2 11111111 member
3 22222222 member
4 33333333 member

 

쿼리 결과 (예)

is_use_cnt(작성한 후기의 개수) is_not_use_cnt(후기를 작성안한 상품의 개수)
3 1

결과에서 is_use_cnt가 3인 이유는

mb_id = 'member' 가 [상품 후기 테이블]에 4개의 데이터가 있지만,

it_id(상품코드) 가 11111111인 후기를 2건(중복가능)을 달았기 때문에, 1건이라고 하였습니다.

 

is_not_use_cnt가 1인 이유는

후기를 작성하지않은 상품의 개수(it_id 고유번호를 기준)를 가져와서, 추후 몇개의 상품에 후기를 달수있다 라고 하는데에 사용하려합니다.

 

[실패...분석]

- 2개의 테이블을 join하면 될 것 같은데... (2시간째 실패했습니다. ㅠㅠ)

- join을 한다면, select (?????) from item_table a left join item_use_table b on (a.it_id = b.it_id) 형식으로 해봤었습니다.

- where절에는 where b.mb_id='member' (아마 이 부분이 이상한것도 같습니다. b.mb_id가 member라면, 결국 item_use_table에서 걸리지니까요..)

by pajama [2022.09.02 17:43:58]

안녕하세요. 아래처럼 해봤습니다.. 회원아이디는 고려하지 않았습니다.

select count(distinct(b.it_id)) is_use_cnt, 
        sum(case when b.it_id is null then 1 else 0 end) is_not_use_cnt
from item_table a
        left outer join item_use_table b on a.it_id = b.it_id 

 


by 보들윤 [2022.09.03 08:19:56]

시간내서 답변해주셔 감사합니다.^^ 많은 도움되었습니다.!


by 신이만든지기 [2022.09.02 17:47:56]
SELECT total - null_cnt AS is_use_cnt
     , null_cnt AS is_not_use_cnt
FROM (SELECT count(DISTINCT a.it_id) AS total
          , sum(CASE WHEN b.it_id IS NULL THEN 1 END) null_cnt
        FROM ITEM_TABLE a LEFT OUTER JOIN item_use_table B
            ON a.it_id = b.it_id AND b.mb_id = 'member'
     ) AS c;

 


by 보들윤 [2022.09.03 08:20:14]

해당 쿼리 실행 아주 잘됩니다.^^

시간내주셔 답변해주셔 진심으로 감사드립니다.


by 마농 [2022.09.04 23:57:07]
-- 조인 후 한번에 카운트 하는 것은 비효율 입니다.
-- 각각 카운트 한 후 합치는 것이 더 효율적일 듯 합니다.
SELECT is_use_cnt
     , item_cnt - is_use_cnt is_not_use_cnt
  FROM (SELECT COUNT(*) item_cnt FROM item_table) a
     , (SELECT COUNT(DISTINCT it_id) is_use_cnt FROM item_use_table WHERE mb_id = 'member') b
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입