2014-10-01 2 views
0

이 스레드를 발견 : Finding all parents in mysql table with single query (Recursive Query). 어떻게 내가 easly 단일 아이의 모든 부모를 찾을 수 있습니다 설명합니다.단일 쿼리를 사용하는 여러 자녀를위한 mysql 테이블의 부모를 모두 찾으십시오.

쿼리로 발견 된 여러 자식에 대해 모든 부모를 가져올 수 있는지 궁금합니다.

예 : 우리는 테이블 울부 짖는 소리처럼이 :

table1 
-------------------- 
id | name | parent_id 
1 | aaa | null 
2 | bbb | 1 
3 | bbb | 1 
4 | ccc | 3 
5 | ccd | 1 

그리고 우리는 'CC'

select id from table1 where name like '%cc%'; 
# ids fetched 
# => 4, 5 
# parents what we're looking for 
# for id = 4 -> 4,3,1 | for 5 -> 5,1 

나는이 같은 시도가 들어 이름을 가진 항목에 대한 모든 부모를 찾으려면했지만 작동하지 않았다 :

SELECT T2.id, T2.name, T2.parent_id, T1._id, T1.lvl 
FROM (
    SELECT 
     @r AS _id, 
     (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id, 
     @l := @l + 1 AS lvl 
    FROM 
     (SELECT @r := l.id from table1 l where name like '%cc%') tmp, 
     table1 t 
    WHERE @r <> 0) T1 
JOIN categories T2 
ON T1._id = T2.id; 

미리 감사드립니다. 내가 충분히 밝혀지지 않았다 및


편집 때문에 가능한 한 많은 예제를 단순화, 그래서 내가 정말 필요의 중요한 부분 놓친 : 내가 찾아야하는 것은 어떤 부모가

입니다 관련 테이블에 true로 설정된 플래그가 있습니다. 내가 3 개 테이블이 : 당신이 기사를 여러 범주를 가질 수 있습니다 볼 수 있듯이

categories 
--------------------- 
id | name | parent_id | flag 

articles 
--------------------- 
id | name 

# intersection between categories and related articles 
category_articles 
--------------------- 
category_id | article_id 

합니다. 부모 깃발 asc (먼저 true, 그 뒤에 false)로 정렬 한 기사를 나열한 다음 이름으로 나열하고 싶습니다. '플래그'열은 기사와 관련된 카테고리 또는 카테고리와 관련된 부모 중 하나가 true로 설정된 경우 true와 같아야합니다. 예 결과 :

articles 
    id | name | flag 
    1 | aaa | true 
    5 | ccc | true 
    2 | hhh | true 
    3 | bbb | false 
    4 | zzz | false 

나는 정렬 파괴하지 않고 제한 및 오프셋을 적용하는 하나 개의 쿼리에서이 작업을 수행해야합니다.

답변

0

MySQL에서는 UNION을 사용하여 여러 select 문의 결과를 단일 결과 집합으로 결합 할 수 있습니다. 이 경우

이 같은 그것을 할 수 :

select id from table1 where name like '%cc%' 
union 
select parent_id from table1 where name like '%cc%'; 
+0

이 내 질문에 대한 좋은 답변이 있지만 내가 무엇을 찾고되지 않습니다. 나는 충분히 명확하지 않은 질문 원인을 업데이트 할 것이다. 어쨌든 당신의 대답은 thx입니다. – SZMER

관련 문제