안녕하세요. 디비는 MySQL이구요
move테이블과 move_sub 테이블에 조회되는 기간이 같으면 카운트를 하고 싶습니다.
먼저 사용자 테이블이 있습니다.
USER
partner_cd | name | phone |
11 | 김이지 | 010-9999-5555 |
13 | 박모모 | 010-1111-3333 |
20 | 송아지 | 010-1234-5678 |
조회되는 날짜에 아래 두테이블에 사용자가 있으면 카운트를 하고 싶습니다.
MOVE
seq | partner_cd | move_date |
1 | 11 | 2022-02-21 01:14:00 |
2 | 13 | 2022-02-22 03:14:00 |
3 | 20 | 2022-02-21 08:14:00 |
MOVE_SUB
seq | partner_cd | move_date |
1 | 11 | 2022-02-22 13:14:00 |
2 | 20 | 2022-02-21 09:14:00 |
3 | 20 | 2022-02-21 06:14:00 |
WHERE DATE(move_date)='2022-02-21'로 조회를 한다면
제가 원하는 데이터는 각각의 move_count를 얻고 싶습니다.
partner_cd | name | phone | move_count | |
11 | 김이지 | 010-9999-5555 | 1 | |
20 | 송아지 | 010-1234-5678 | 3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SELECT T1.PARTNER_CD , T1. NAME , T1.PHONE , COUNT (1) AS MOVE_COUNT FROM USER T1 INNER JOIN ( SELECT * FROM MOVE UNION ALL SELECT * FROM MOVE_SUB ) T2 ON T1.PARTNER_CD = T2.PARTNER_CD WHERE DATE (MOVE_DATE) = '2022-02-21' GROUP BY T1.PARTNER_CD , T1. NAME , T1.PHONE |
MOVE 와 MOVE_SUB 테이블은 형식이 같고, 각 테이블에 JOIN 된 항목 모두를 COUNT 해야 하기에 UNION ALL 처리를 했습니다.
UNION ALL 된 테이블을 단순 JOIN 해서 GROUP BY 한 것이라 내용적으로는 복잡하진 않을거 같습니다.
비효율 : 컬럼을 가공하여 조건을 주지 말고 DATE(move_date)='2022-02-21'
개선 : 컬럼은 그대로 두고 조건을 가공하여 비교하세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SELECT a.partner_cd , a. name , a.phone , b.move_cnt FROM user a INNER JOIN ( SELECT partner_cd , COUNT (*) move_cnt FROM ( SELECT partner_cd FROM move WHERE move_date >= '2022-02-21' AND move_date < '2022-02-21' + INTERVAL 1 DAY UNION ALL SELECT partner_cd FROM move_sub WHERE move_date >= '2022-02-21' AND move_date < '2022-02-21' + INTERVAL 1 DAY ) b GROUP BY partner_cd ) b ON a.partner_cd = b.partner_cd ; |