by xcrew [2022.04.27 17:00:00]
안녕하세요. 디비는 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 |
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 한 것이라 내용적으로는 복잡하진 않을거 같습니다.
감사합니다. 도움 많이 되었습니다!!!
-- 날짜 조건절
where move_date between str_to_date('2022-02-21', '%Y-%m-%d')
and subdate(adddate(str_to_date('2022-02-21', '%Y-%m-%d'), INTERVAL 1 DAY), INTERVAL 1 SECOND)
깨알같은 개선쿼리 ^^;
답변 감사드립니다~!!!
비효율 : 컬럼을 가공하여 조건을 주지 말고 DATE(move_date)='2022-02-21'
개선 : 컬럼은 그대로 두고 조건을 가공하여 비교하세요.
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
;
항상 감사합니다~! 마농님!!