썩구노트
MySQL : 임시테이블을 이용한 서브쿼리 처리하기 본문
문제의 시작
Tree 형식으로 된 카테고리 정보를 데이터베이스화 하기 위한 작업을 하고 있었다.
기본적으로 카테고리 정보는 카테고리 이름과 고유 코드 번호 그리고 자식 노드들로 이루어 져 있었는데
그것을 이런식으로 데이터베이스에 집어 넣었다
고유 코드 | 카테고리 명 | 부모 코드 |
1 | 삼성 | 0 |
2 | 노트북 | 1 |
3 | 핸드폰 | 1 |
... | ... | ... |
이제 하나의 카테고리 명에 대한 상위 카테고리의 정보를 얻으려고 다음과 같은 쿼리를 날렸다.
mysql> SELECT * FROM CAT_TREE WHERE unique_code = (SELECT par_code FROM CAT_TREE WHERE cate_name = "애플" ) ;
ERROR 1242 (21000): Subquery returns more than 1 row
아...
ERROR 1242 (21000): Subquery returns more than 1 row 에러는 찾아보니
서브쿼리가 하나 이상의 레코드를 리턴하는 문장들에 대해 발생하는 에러란다.
그 해결책이 ANY 를 붙이란다.
그래서 다음과 같은 쿼리로 변경해서 날렸지.
mysql> SELECT * FROM CAT_TREE WHERE unique_code = ANY(SELECT par_code FROM CAT_TREE WHERE cate_name = "애플" ) ;
+-------------+-----------+----------+
| unique_code | cate_name | par_code |
+-------------+-----------+----------+
| 2 | 노트북 | 1 |
| 93 | 브랜드PC | 1 |
| 621 | MP3 | 502 |
+-------------+-----------+----------+
드디어 나왔다 ~~16분 뒤에 !!!!
저거 3줄 뽑는데 16분 걸렸다...
그래서 해결하기 위해 오만방법을 찾아내던중 찾았다
임시테이블을 이용하여 서브쿼리를 처리하는 방법
SELECT * FROM (임시테이블) AS 임시테이블명 GROUP BY 그룹할 필드명 ORDER BY 랭킹 기준 DESC;
난 이것을 내가 하고자 하는 것에 적용시켜 다음과 같이 쿼리를 생성했다
SELECT * FROM 테이블명 AS T1 , (SELECT 부모노드 FROM 테이블명 WHERE 카테고리명 = "애플") AS 임시테이블명 WHERE T1.고유번호 = 임시테이블명.부모노드 ;
mysql> select * from CAT_TREE AS CT , (SELECT par_code from CAT_TREE where cate_name = "애플") as temp where CT.unique_code = temp.par_code ;
+-------------+-----------+----------+----------+
| unique_code | cate_name | par_code | par_code |
+-------------+-----------+----------+----------+
| 2 | 노트북 | 1 | 2 |
| 93 | 브랜드PC | 1 | 93 |
| 621 | MP3 | 502 | 621 |
+-------------+-----------+----------+----------+
3 rows in set (0.01 sec)
아... par_code 겹친다.
그래서
mysql> select unique_code, cate_name, par_code from CAT_TREE AS CT , (SELECT par_code AS PC from CAT_TREE where cate_name = "애플") as temp where CT.unique_code = temp.PC ;
+-------------+-----------+----------+
| unique_code | cate_name | par_code |
+-------------+-----------+----------+
| 2 | 노트북 | 1 |
| 93 | 브랜드PC | 1 |
| 621 | MP3 | 502 |
+-------------+-----------+----------+
3 rows in set (0.02 sec)
'DB' 카테고리의 다른 글
mysql덤프 (0) | 2016.11.24 |
---|---|
MySQL : 필드(Field)를 구분자로 묶어 출력하기 (CONCAT) (0) | 2016.11.09 |
MYSQL : MySQL 대소문자 구분 (0) | 2016.11.09 |
MySQL : 해당 필드에 중복된 값 찾기 (0) | 2016.11.09 |
MySQL : ALTER - 칼럼(column)의 구조나 형식을 변경하기 (0) | 2016.11.09 |