2017-03-22 1 views
0

나는 두 개의 테이블이 있습니다MySQL - JOIN은 컬럼의 값을 기반으로합니까?

Table "categories" 

category | parents 
1   | 5,4,1 
2   | 3,2 

열 부모가 쉼표로 구분 번호의 그룹을, 그래서는 IN(parents)

Table "categories_goods" 

item | category 
10 | 1 
12 | 2 

으로 쿼리에 사용될 수있는 그리고 세 번째 테이블에 데이터를 내보낼 - 모든 카테고리에 모든 부모가있을 것입니다. 결과는 다음과 같아야합니다

Table "categories_goods_all" 

item | category 
10 | 5 
10 | 4 
10 | 1 
12 | 3 
12 | 2 

나는이 PHP에서 해결했지만, 10000 * X 테이블 categories_goods의 행이있는 경우가 느립니다. 그래서 순수한 MySQL 솔루션을 찾고 있습니다. 어떤 아이디어?

답변

1

사용이

데모 : http://rextester.com/CAF76544

쿼리이 answer

select 
    g.item, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(c.parents, ',', numbers.n), ',', -1) category1 
from 
    (select 1 n union all 
    select 2 union all select 3 union all 
    select 4 union all select 5) numbers 
INNER JOIN categories c 
    on CHAR_LENGTH(c.parents) 
    -CHAR_LENGTH(REPLACE(c.parents, ',', ''))>=numbers.n-1 
    inner join categories_goods g 
    on c.category=g.category 
order by 
    c.category, n 

덕분 행에 CSV를 분할합니다.

설명 : number 테이블은 숫자 1 - 5을 생성합니다. 더 많은 경우 parent에 필요한 경우 여기에 행을 추가 할 수 있습니다. 도움이 있으면 csv을 열로 구분할 수 있습니다. 위에 주어진 대답 URL을 참조하십시오.

지금 당신은이 위대한 일 감사 itemparent

+0

에 해당하는 가져 오기 위해이 categories_goods에 가입 할 필요가! :) 어떤 수의 값을 파싱하는 방법은 있습니까? 이제는 5로 작동합니다. select 6 union all을 수동으로 추가 할 수는 있지만 어떻게 든 무한히 가능합니까? –

관련 문제