>  기사  >  데이터 베이스  >  단일 쿼리를 사용하여 MySQL 계층 테이블에서 노드의 모든 상위 항목을 어떻게 찾을 수 있습니까?

단일 쿼리를 사용하여 MySQL 계층 테이블에서 노드의 모든 상위 항목을 어떻게 찾을 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-26 18:29:11353검색

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

재귀 CTE를 사용하여 단일 쿼리로 MySQL 테이블에서 모든 상위 항목 찾기

계층 구조의 데이터베이스에서 상위 항목 식별 특정 레코드를 처리하는 것은 복잡한 작업일 수 있습니다. MySQL에서는 재귀 공통 테이블 표현식(CTE)을 사용하여 이 문제를 효율적으로 해결할 수 있습니다. 문제 설명과 그 해결책을 살펴보겠습니다.

문제 설명:

계층 구조(예: 제공된 스키마의 구조)가 있는 MySQL 테이블이 주어졌습니다. 각 행은 ID, 제목, 부모 ID 및 기타 관련 정보가 있는 노드를 나타내며, 작업은 다음을 사용하여 계층 구조에 있는 특정 노드의 모든 조상(부모)을 검색하는 것입니다. 단일 쿼리.

해결책:

제공되는 솔루션은 재귀 CTE를 활용하여 계층 구조를 탐색하고 해당 ID로 지정된 노드의 상위를 식별합니다. 다음 쿼리는 접근 방식을 보여줍니다.

SELECT T2.id, T2.title, T2.controller, T2.method, T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

쿼리 설명:

  • 하위 쿼리는 두 개의 사용자 정의 변수 @r 및 @l을 초기화합니다. ID 31로 지정된 레코드를 선택합니다(대상 노드라고 가정). 이러한 변수는 재귀 반복 중에 현재 노드 ID(@r)와 레벨(@l)을 추적하는 데 사용됩니다.
  • CTE의 재귀 부분은 반복적으로 현재 노드의 상위 ID를 가져와 레벨을 증가시킵니다. . 이 프로세스는 현재 노드에 상위 노드가 없을 때까지 계속됩니다(즉, @r이 0임).
  • 외부 쿼리는 _id(레코드 ID)를 기반으로 재귀 CTE를 기본 테이블(메뉴)과 조인하여
  • ORDER BY 절을 사용하면 결과를 해당 레벨의 내림차순으로 정렬하여 조상을 계층적으로 표시합니다. order.

이 쿼리는 단일 SQL 문으로 지정된 노드의 모든 상위 항목을 효율적으로 검색하여 MySQL에서 계층적 데이터를 탐색하기 위한 편리하고 효율적인 솔루션을 제공합니다.

위 내용은 단일 쿼리를 사용하여 MySQL 계층 테이블에서 노드의 모든 상위 항목을 어떻게 찾을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.