mysql - 특정 - 오라클 두번째 row




하나의 SQL 쿼리에서 모든 부모 행 가져 오기 (4)

나는 카테고리의 목록을 포함하는 간단한 MySQL 테이블을 가지고, 레벨은 parent_id에 의해 결정됩니다 :

id  name    parent_id
---------------------------
1   Home        0
2   About       1
3   Contact     1
4   Legal       2
5   Privacy     4
6   Products    1
7   Support     1

빵 부스러기 흔적을 만들려고합니다. 그래서 저는 아이의 'id'를 가지고 있습니다. 가능한 모든 부모를 얻고 싶습니다. (우리는 0 홈에 도달 할 때까지 체인을 반복합니다.) 무제한 깊이로 이동하는 숫자 행이나 자식 행이있을 수 있습니다.

현재 각 부모에 대해 SQL 호출을 사용하고 있는데, 이것은 지저분합니다. SQL에서이 모든 작업을 하나의 쿼리로 처리하는 방법이 있습니까?


AFAIK 아니오.

이 Sitepoint 기사 가 도움이 될 것입니다.

here 설명 된 것처럼 하나의 쿼리로 모든 요소를 ​​검색하여 배열에 저장 한 다음 반복 할 수 here


Mark Byers의 멋진 답변!

어쩌면 파티에 좀 늦을 수도 있지만, id = parent_id 일 때 무한 루프를 막으려는 경우 (예 : 데이터가 어떻게 든 손상된 경우) 다음과 같이 답변을 확장 할 수 있습니다.

SELECT T2.id, T2.name
FROM (
    SELECT
        @r AS _id,
        @p := @r AS previous
        (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 5, @p := 0, @l := 0) vars,
        table1 h
    WHERE @r <> 0 AND @r <> @p) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC

제 생각에, 하나의 쿼리를 사용하면 쉽게 할 수있는 방법이 없습니다.

중첩 된 세트를 살펴 보는 것이 좋을 듯 싶습니다.


here 에서 적응 :

SELECT T2.id, T2.name
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 := 5, @l := 0) vars,
        table1 h
    WHERE @r <> 0) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC

@r := 5 줄은 현재 페이지의 페이지 번호입니다. 결과는 다음과 같습니다.

1, 'Home'
2, 'About'
4, 'Legal'
5, 'Privacy'




hierarchical-data