2012-03-20 5 views
1

이 테이블이 있습니다. 이 MySQL 쿼리의 문제점

id name     parents 
1 Apparel                  
46 Apparel     1             
47 Child Apparel   1,46            
49 Child Apparel 2   46,1            

나는이 쿼리를 시도하고 그것을 잘 작동합니다.

SELECT * FROM categories WHERE 1 IN (parents) 

id name   parents 
46 Apparel  1             
47 Child Apparel 1,46 

왜이 쿼리가 2 대신 1 레코드를 가져 오나요?

SELECT * FROM categories WHERE 46 IN (parents) 

id name    parents 
49 Child Apparel 2 46,1 
+0

첫 쿼리는 결과로 3 행을 반환합니다. 그것은 무엇입니까? 다 대 다 관계 같은 것? 두 쿼리가 동일하게 작동하면 부모가 지정된 번호에서 시작하는 행을 반환합니다. – teran

+0

디자인이 First Normal Form을 위반하며 가능한 경우 수정해야합니다. http://en.wikipedia.org/wiki/First_normal_form – heikkim

+0

@teran 네 말이 맞아. – Neutralizer

답변

7

당신은 IN 대신 FIND_IN_SET를 사용한다 :이 쿼리 속도가 느린 것

SELECT * FROM categories WHERE FIND_IN_SET('46', parents) 

하는 것으로. 데이터베이스를 재 설계해야합니다. 난 당신이 MySQL의에서 계층 구조로 데이터를 저장하는 더 나은 방법이 슬라이드 쇼를 볼 제안 :

+0

이 모델을 여러 테이블로 정규화하는 것이 더 빠릅니까? – Neutralizer

+2

+1 "데이터베이스를 다시 디자인해야합니다." – Kaii

+0

@UmairAshraf : 예, 정규화 된 버전은 인덱스를보다 잘 사용할 수 있기 때문에 성능이 향상 될 수 있습니다. –

0

당신이 카테고리 테이블이 테이블을 유지해야 worng 방법이를 유지합니다.

부모의

루트 카테고리는 당신도 할 수

언급으로

그래서 부모 컬럼 만하지 더 후 1 개 값 1 개 값을 유지 루트 카테고리의 값을 포함하는 상위 1 개 하위 범주를 포함 재귀 함수를 사용하여 해당 레코드를 가져 오십시오.

function showlist($parent) { 
$result = mysql_query("SELECT ID FROM categorie WHERE parentID='$parent'"); 
while ($line = mysql_fetch_array($result)) { 
if($catlistids!=""){ $catlistids .= ", "; } 
$catlistids .= $line["ID"]; 
showlist($line["ID"]); 

} 
return $catlistids; 

} 
+0

나는 재귀적인 것을 싫어한다. 나는 당신이 의미하는 것을 이해하지 못합니다. – Neutralizer

+0

[link] (http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set)을 사용할 수 있습니다. –