>데이터 베이스 >MySQL 튜토리얼 >단일 재귀 쿼리를 사용하여 MySQL 테이블에서 모든 상위 레코드를 어떻게 찾을 수 있습니까?

단일 재귀 쿼리를 사용하여 MySQL 테이블에서 모든 상위 레코드를 어떻게 찾을 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-06 18:59:12413검색

How Can I Find All Parent Records in a MySQL Table Using a Single Recursive Query?

재귀를 사용하여 MySQL 테이블에서 상위 찾기

데이터베이스 스키마에서는 계층적 관계를 설정하는 것이 일반적입니다. 이러한 데이터를 쿼리할 때는 특정 레코드뿐만 아니라 해당 레코드의 계층적 연결도 검색해야 합니다. 이 문서에서는 단일 쿼리를 사용하여 MySQL 테이블 내에서 레코드의 모든 상위 항목을 찾는 작업을 설명합니다.

문제 설명

ID, TITLE 열이 있는 테이블이 제공됩니다. , CONTROLLER, METHOD 및 PARENT_ID는 단일 SQL을 사용하여 TITLE이 "Categories"인 레코드의 모든 상위 항목을 찾습니다. 쿼리.

원하는 출력

출력에는 다음이 표시되어야 합니다. 열:

  • id
  • 제목
  • 컨트롤러
  • 메서드
  • url
  • parent_id

다음을 가져와야 합니다. 레코드:

id title controller method url parent_id
3 Modules admin modules (NULL) 0
17 User Modules modules user_module (NULL) 3
31 Categories categories category (NULL) 17

솔루션

원하는 결과를 얻으려면 MySQL의 재귀 쿼리 기능을 활용해야 합니다. 사용할 수 있는 SQL 쿼리는 다음과 같습니다.

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;

이 쿼리를 분석해 보겠습니다.

  • 내부 쿼리(SELECT @r AS _id, ...)는 다음과 같은 계층 구조를 생성합니다. PARENT_ID를 반복적으로 선택하고 레벨을 증가시켜 기록합니다.
  • 외부 쿼리(SELECT T2.id, ...) 내부 쿼리를 원래 테이블 메뉴(T2로 이름 변경)와 결합하여 원하는 데이터를 얻습니다.
  • ORDER BY 절은 결과를 수준별로 내림차순으로 정렬합니다.

실행하여 이 쿼리를 사용하면 단일 데이터베이스 호출에서 TITLE이 포함된 레코드의 모든 상위 항목을 "Categories"로 검색할 수 있습니다.

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

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