Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

mysql 기부 데이터 추출 경험

MYSQL, 20223 min read

배경

기존 후원자 중복 검사를 위해 아래 조건의 기부 데이터를 추출을 요청받았다

기간 2022년 1월~2022년 5월 25일,
물품기증 1~4회
연령대: 35세~65세
성별: 여성
개인정보 필요 항목
이름
휴대폰번호
생년월일
기증횟수
기부금영수증 발행여부(발행/미발행)
이메일주소
주소(상세주소포함)
우편번호

어디서 해당 정보를 확인할 수 있지?

현재는 기부,기부 공제자,배송지,회원 테이블에서 조인을 통해서 얻어야 했다.

처음에는..

아래 쿼리처럼 서브쿼리를 사용해서 특정기간에 기부했던 회원 정보를 추출했고(쿼리 A) 추출된 회원 id 로 기부 데이터를 추출했다.

(쿼리 A)

select
m.*,
donation_count as '기증횟수'
from(SELECT
member_id, count(member_id) as donation_count FROM donations as d
GROUP BY member_id HAVING count(*) > 1 ) as dc
inner join members as m
on dc.member_id = m.id
...
and donation_count between 1 and 4

(쿼리 B)

SELECT
a.*,
b.*,
c.*
FROM donations as a
left join deliveries as b on a.id = b.donation_id
left join donors as c on a.id = c.donation_id
and a.member_id IN ( ... m.id 컬럼만 추출되도로 쿼리 A 를 수정 후 입력 )

(쿼리 A) 의 경우 서브쿼리를 썼는데 하나의 쿼리에서 같은 테이블을 여러번 써서 겨우 데이터를 추출했다. 다시 찾아보니 서브쿼리를 쓰지 않고 group by 를 써서 기부횟수를 구할 수 있었다.

(쿼리 C)

select
m.*,
count(m.id) as '기증횟수'
from donations as d
inner join members as m
on d.member_id = m.id
and ...
group by m.id
having count(m.id) between 1 and 4

(쿼리 C) 처럼 group by m.id having count(m.id) between 1 and 4
회원당 기부 횟수를 알 수 있고 having 써서 조건까지 걸 수 있다.

20221102 GROUP BY 확장

scheduled_date 는 20220912 의 형태의 string 이다 년월로 group 를 만들어서 년/월에 예약된 발송건수를 알 수 있다

SELECT DATE_FORMAT(scheduled_date,'%Y%m') yearAndMonth ,COUNT(*) count
FROM `news`
GROUP BY DATE_FORMAT(scheduled_date,'%Y%m')
HAVING yearAndMonth is not null;
yearAndMonthcount
2022096
2022111

group by having

https://m.blog.naver.com/kim87838/110157966081 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=battledocho&logNo=220034040242 https://wikidocs.net/132671

© 2024 by GwiyeomGo Tech Blog. All rights reserved.