올해 mrlee.co.kr을 운영하면서 썼던 게시글의 호응을 알아보기로 했다.
※참고사항
g5_board_new는 게시글 데이터를 모은 곳
wr_hit은 조회수
bo_subj는 게시글의 제목
bn_datetime은 게시글을 올린 당시 날짜
bo_table은 카테고리
1) 먼저 필터링을 설정
- 올해 작성된 게시글
- 카테고리(bo_table항목)는 ecopol(정치경제), mystery(미스테리), story(괴담)
SELECT wr_hit, bo_table, bo_subj FROM g5_board_new
WHERE
bo_table IN ('ecopol', 'mystery', 'story')
AND
bn_datetime > '2021-01-01'
결과창
2) 여기서 카테고리를 기준으로 분류
- GROUP BY는 이후 제시되는 항목을 기준으로 분류
- SUM은 분류가 이뤄질 때 특정항목이 숫자타입일 경우 해당분류 속한 데이터의 항목 값을 모두 합산
- COUNT는 분류가 이뤄질 때 해당분류에 속한 데이터의 개수를 나타냄
SELECT bo_table, SUM(wr_hit) sum_hit, COUNT(0) AS cnt FROM g5_board_new
WHERE
bo_table IN ('ecopol', 'mystery', 'story')
AND
bn_datetime > '2021-01-01'
GROUP BY
bo_table
결과창
3) 분류된 값을 다 더하고, 한개의 row로 나타낸다.
- sub query는 출력된 데이터를 하나의 테이블로 인식하게 해주는 장치
- CASE ~ WHEN ~ THEN ~ ELSE ~
=> CASE에서 "조건을 제시하겠다" 선언
=> WHEN에선 "조건의 세부설정" (이 WHEN은 1개 이상의 구절)
=> THEN은 "WHEN"의 세부조건값이 맞을 경우 처리하는 부분
=> ELSE는 WHEN세부조건값에 해당되지 않는 나머지 데이터에 대한 처리부분
=> 이 구문의 끝은 END를 표기해서 다른 항목과 구분되도록 한다.
SELECT
SUM(sum_hit) total_hit,
SUM(cnt) total_cnt,
SUM(case when bo_table = 'ecopol' then sum_hit ELSE 0 END) ecopol_hit,
SUM(case when bo_table = 'ecopol' then cnt ELSE 0 END) ecopol_cnt,
SUM(case when bo_table = 'mystery' then sum_hit ELSE 0 END) mystery_hit,
SUM(case when bo_table = 'mystery' then cnt ELSE 0 END) mystery_cnt,
SUM(case when bo_table = 'story' then sum_hit ELSE 0 END) story_hit,
SUM(case when bo_table = 'story' then cnt ELSE 0 END) story_cnt
FROM
(
SELECT bo_table, SUM(wr_hit) sum_hit, COUNT(0) AS cnt FROM g5_board_new
WHERE
bo_table IN ('ecopol', 'mystery', 'story')
AND
bn_datetime > '2021-01-01'
GROUP BY
bo_table
) A
결과창
4) 백분율로 나타내기
- 위의 데이터를 또 하나의 sub-query로 나타낸다.
SELECT
total_hit, total_cnt,
ecopol_hit/total_hit*100 ecopol_hit_per, ecopol_cnt/total_cnt*100 ecopol_cnt_per,
mystery_hit/total_hit*100 mystery_hit_per, mystery_cnt/total_cnt*100 mystery_cnt_per,
story_hit/total_hit*100 story_hit_per, story_cnt/total_cnt*100 story_cnt_per
FROM
(
SELECT
SUM(sum_hit) total_hit,
SUM(cnt) total_cnt,
SUM(case when bo_table = 'ecopol' then sum_hit ELSE 0 END) ecopol_hit,
SUM(case when bo_table = 'ecopol' then cnt ELSE 0 END) ecopol_cnt,
SUM(case when bo_table = 'mystery' then sum_hit ELSE 0 END) mystery_hit,
SUM(case when bo_table = 'mystery' then cnt ELSE 0 END) mystery_cnt,
SUM(case when bo_table = 'story' then sum_hit ELSE 0 END) story_hit,
SUM(case when bo_table = 'story' then cnt ELSE 0 END) story_cnt
FROM
(
SELECT bo_table, SUM(wr_hit) sum_hit, COUNT(0) AS cnt FROM g5_board_new
WHERE
bo_table IN ('ecopol', 'mystery', 'story')
AND
bn_datetime > '2021-01-01'
GROUP BY
bo_table
) A
) AA
결과창
5) 결과값 이용 결론 도출
- 경제정치 글의 개수가 제일 많다는 걸 알 수 있다. (ecopol_hit_per = 20%)
- 미스테리 글의 관심이 제일 많다는 걸 알 수 있다. (mystery_hit_per = 51%)
'PHP' 카테고리의 다른 글
iframe에서 단축url이 안먹힐 때 해결방법 (단축url full url로 복구시키기) (0) | 2023.05.08 |
---|---|
통계 데이터를 원형그래프(piechart)로 나타내기 (google chart api 연동) (0) | 2021.10.08 |
php에서 form-get방식으로 특수문자열을 전달할 때 쓰이는 함수 : urlencode (0) | 2021.09.13 |
htaccess, RewriteRule을 이용해서 주소문자열 줄여보자 (0) | 2021.09.07 |
[Binance API] Invalid API-key, IP, or permissions for action, request ip (code=-2015) 해결했다! (0) | 2021.08.26 |