tb_purchaseinfo (구매 상세 테이블)는
tb_purchase (구매 테이블)를 참조하고 있다.
구매 한 건에 구매 상세도 한 건인 데이터도 있고
구매 한 건에 구매 상세가 세 건인 데이터도 있다.
페이지에는 구매 데이터만 뿌리고,
그 중에서 구매 데이터를 하나 클릭하면
클릭한 구매 데이터를 참조하고 있는
구매 상세 데이터들을 불러와서
서브 테이블에 나열하려고 한다.
SELECT
p.pur_id, i.purinf_id, p.loginID
FROM
tb_purchase p
INNER JOIN tb_purchaseinfo i ON p.pur_id = i.pur_id
WHERE
p.loginID = 'apple'
GROUP BY
i.pur_id
구매 데이터만 뿌릴 때,
페이징 처리도 해야 한다.
따라서 위의 select sql 문으로 실행했을 때
데이터 건 수가 총 몇 건인지 받아와야 한다.
따라서 아래처럼 count(*)함수를 썼다.
SELECT
COUNT(*)
FROM
tb_purchase p
INNER JOIN tb_purchaseinfo i ON p.pur_id = i.pur_id
WHERE
p.loginID = 'apple'
GROUP BY
i.pur_id;
결과가 내가 원하던 대로 나오지 않았다.
위 sql을 실행한 결과가 총 몇 건이 나오는지
하나의 숫자가 나와야 하는데,
데이터가 여러 건이 조회되었다.
이유는 group by 가 count(*) 에 붙었기 때문이다.
해결 방법은 서브 쿼리를 이용하는 방식이다.
subquery 를 쓸 때는 뒤에 alias를 붙여주지 않으면 에러가 난다.
SELECT
COUNT(*)
FROM (
SELECT
COUNT(*)
FROM
tb_purchase p
INNER JOIN tb_purchaseinfo i ON p.pur_id = i.pur_id
WHERE
p.loginID = 'apple'
GROUP BY
i.pur_id
) a;
> 덧붙임
아래처럼 에러가 나기도 한다.
MySQL Database Error: Duplicate column name 'pur_id'. Add a differentiating column alias.
"pur_id" 라는 칼럼 이름이 겹친다는 뜻이다.
서브 쿼리를 쓰면서 이름이 겹치기도 한다.
안쪽 서브쿼리에 select 를
"select *" 로 쓰지 말고
적당한 칼럼을 특정하거나 alias를 붙여야 한다.
SELECT p.pur_id AS temp_col
등으로 select를 조회하면 된다.
-220413
반응형
'DataBase' 카테고리의 다른 글
[SQL] inner join 을 써야 할 때와 left join 을 써야 할 때 / 차이 (0) | 2022.04.18 |
---|---|
sql 날짜 비교 where 절 조건 넣을 때 주의할 점 (0) | 2022.04.17 |
가장 최근에 insert한 row의 pk 값 받아오기 (테이블을 참조해야 할 때) (0) | 2022.04.13 |
sql 특정 문자열을 포함하는지 확인하는 함수 contains (mySQL, Oracle) (0) | 2022.04.12 |
mySQL 에서 insert into 구문 한 번에 여러 줄 추가하기 (0) | 2022.04.02 |