티스토리 뷰
반복되는 컬럼을 한줄로 표현하여 개선
다수의 테이블은 어떻게 조합할 것인가?
MySQL에서 테이블을 조합하는 과정은 크게 2가지 방법(UNION / JOIN)이 있다.
어느 함수가 더 뛰어나다 라는 것은 없으며 상황에 적합하도록 사용하면 된다.
나의 경우 3개의 테이블(PC / MA / MW)에서 동일 데이터 컬럼을 가져왔으며
UNION을 사용하는 것이 적합했기에 최종 select 에서는 UNION을 사용했으며
부가적으로 세부 컬럼을 가져와야 할 경우는 JOIN으로 획득하였다.
최초 작성 쿼리
문제
해당 쿼리가 작동하는데 있어서 문제는 없지만
해당 결과를 화면에 보여준다면 문제가 생기게 된다.
만일'집계'가 Daily, 하루 단위로 집계가 된다면 최대 12개월의 31일 그리고 해당 테이블의 컬럼 갯수
즉, 최소 372n 의 결과가 나타나는 것이다.
cnt | tbname | n_date |
---|---|---|
41 | A* | 2023-04-02* |
10 | B* | 2023-04-02* |
6 | C | 2023-04-03 |
6 | A | 2023-04-04 |
750 | C* | 2023-04-02* |
... | ... | ... |
56 | C | 2023-04-30 |
해당 결과를 다음과 같은 형식으로 개발한다면 어떨까?
```xml
<pv_date>20230402</pv_date>
<pvs>
<A>41</A>
<B>10</B>
<C>750</C>
</pvs>
...
```
개선
월별, 작성일, 고유 코드를 기준으로 3번 순회해야 하지만
> 컬럼의 수[별도의 테이블의 갯수(3개) * 1달(31)] * 3번 순회를 생각한다면
위 xml을 만들기 위해 270번의 작업 처리를 반복해야 한다.
나는 php 코드 개선 이전에 테이블에서 낭비되는 컬럼 데이터 즉 (PC: 41 / MW: null / MA: null)
에 집중하였고 `tbname` 컬럼을 기준으로 만일 한줄로 집계할 수 있다면
2번의 순회로 정리할 수 있다 생각했다
테이블 개선
결과 테이블을 확인해보자 컬럼`tbname`이 중복되는 것을 볼 수 있는데
하나의 컬럼에 동일한 `tbname`에 해당하는 `cnt` 값을 몰아준다면 어떨까?
전
cnt | tbname | n_date |
---|---|---|
41 | A* | 2023-04-02* |
10 | B* | 2023-04-02* |
6 | C | 2023-04-03 |
6 | A | 2023-04-04 |
750 | C* | 2023-04-02* |
... | ... | ... |
56 | C | 2023-04-30 |
후
A | B | C | n_date |
---|---|---|---|
41 | 6 | 750 | 2023-04-02 |
6 | 0 | 0 | 2023-04-03 |
6 | 0 | 0 | 2023-04-04 |
... | |||
0 | 0 | 56 | 2023-04-30 |
쿼리 수정
개선된 테이블을 의 컬럼수는 최대 해당 월의 일수로만큼 줄일 수 있었다.
> 컬럼의 수[통합된 테이블의 갯수(1개) * 1달(31)] * 2번 순회
'DataBase' 카테고리의 다른 글
SphinxSE는 Join 쿼리를 지원하는가? (2) | 2024.07.05 |
---|---|
SUBQUERY와 JOIN 무엇을 선택해야할까? (0) | 2023.03.15 |
스핑크스 SQL의 특징과 문제점 (0) | 2022.10.18 |
Common Table Expression (0) | 2022.09.17 |
DB 암호화 기법 (1) | 2022.09.16 |
- Total
- Today
- Yesterday
- 그래프
- 디자인패턴
- 수학
- Solid
- kakao
- JPA
- C언어
- CS
- java
- 매트랩
- Spring
- 자바
- 프로그래머스
- 알고리즘
- 스프링
- Algorithm
- 백준
- security
- ajax
- interview
- Matlab
- 자격증
- 면접
- spring-cloud
- 스프링부트
- docker
- 릿코드
- OOP
- nginx
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |