문서 관리 시스템에서
Archive 기능은 쉽게 찾아볼 수 있다. 나는 내 사이트(joinc)에서 아래와 같은 Archive Posts를 구현하기로 했다.
Archive 기준은 아래와 같다.
- MYSQL 5.8 버전
- 문서의 저장시간은 createdate 필드에 저장되고 있다. 이 정보를 이용해서 월/년 단위로 몇 개의 Post가 올라왔는지 쿼리 한다.
- createdate 필드는 datetime 타입이다.
MYSQL에서 제공하는 MONTH, YEAR 함수를 이용해서, 해당 시간의 년, 월 값을 가져올 수 있다.
SELECT MONTH('2022-01-22 05:00:32');
// +-----------------------------+
// | YEAR('2022-01-22 05:00:32') |
// +-----------------------------+
// | 1 |
// +-----------------------------+
// 1 row in set (0.00 sec)
SELECT YEAR('2022-01-22 05:00:32');
// +-----------------------------+
// | YEAR('2022-01-22 05:00:32') |
// +-----------------------------+
// | 2022 |
// +-----------------------------+
// 1 row in set (0.00 sec)
이제 년, 월을 Group By 해주면 원하는 값을 얻을 수 있을 것이다.
select count(*), MONTH(createdate), YEAR(createdate) from page group by YEAR(createdate), MONTH(createdate);
// +----------+-------------------+------------------+
// | count(*) | MONTH(createdate) | YEAR(createdate) |
// +----------+-------------------+------------------+
// | 26 | 12 | 2015 |
// | 2976 | 1 | 2016 |
// | 20 | 2 | 2016 |
// | 7 | 3 | 2016 |
// | 11 | 4 | 2016 |
// ......
하지만 MONTH와 YEAR를 내림차순으로 정리해야 할 것 같다. MONTH와 YEAR 함수의 결과를 각각
order by desc 하면 된다.
select count(*), MONTH(createdate), YEAR(createdate) from page group by YEAR(createdate), MONTH(createdate) order by YEAR(createdate) desc, MONTH(createdate) desc;
// +----------+-------------------+------------------+
// | count(*) | MONTH(createdate) | YEAR(createdate) |
// +----------+-------------------+------------------+
// | 5 | 1 | 2022 |
// | 2 | 12 | 2021 |
// | 2 | 11 | 2021 |
// | 6 | 10 | 2021 |
// | 6 | 9 | 2021 |