[상품 테이블]과 해당 상품의 [후기 작성 테이블]을 조회하여,
현재 쿼리를 실행하는(로그인한 회원을 의미) 회원이 상품에 몇개의 후기를 작성했고,
앞으로 몇개의 상품에 후기를 작성할 수 있는지 구하고 싶습니다.
[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에서 걸리지니까요..)
안녕하세요. 아래처럼 해봤습니다.. 회원아이디는 고려하지 않았습니다.
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
시간내서 답변해주셔 감사합니다.^^ 많은 도움되었습니다.!
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;
해당 쿼리 실행 아주 잘됩니다.^^
시간내주셔 답변해주셔 진심으로 감사드립니다.
-- 조인 후 한번에 카운트 하는 것은 비효율 입니다.
-- 각각 카운트 한 후 합치는 것이 더 효율적일 듯 합니다.
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
;