썩구노트

MySQL : 임시테이블을 이용한 서브쿼리 처리하기 본문

DB

MySQL : 임시테이블을 이용한 서브쿼리 처리하기

양석규 2016. 11. 9. 10:49

  문제의 시작 


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)


문제해결 ~!!