본문 바로가기

DataBase

참조하는 테이블에서 하위 항목이 몇 건인지 출력하는 법

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

반응형