> 데이터 베이스 > MySQL 튜토리얼 > 단일 재귀 쿼리를 사용하여 MySQL 테이블에서 모든 상위 항목을 찾는 방법은 무엇입니까?

단일 재귀 쿼리를 사용하여 MySQL 테이블에서 모든 상위 항목을 찾는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-30 19:23:15
원래의
201명이 탐색했습니다.

How to Find All Parent Entries in a MySQL Table Using a Single Recursive Query?

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

메뉴나 카테고리와 같은 테이블은 항목이 다음과 같은 계층 구조를 갖는 경우가 많습니다. 부모-자식 관계를 통해 서로 연결됩니다. 이러한 시나리오에서는 특히 단일 쿼리로 검색을 시도할 때 특정 항목의 모든 상위 항목을 검색하는 것이 어려울 수 있습니다.

메뉴 항목이 포함된 다음 스키마를 고려하세요.

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
|  4 |             Users |      admin |             users |         0 |
|  5 |          Settings |      admin |          settings |         0 |
|  6 |           Reports |      admin |           reports |         0 |
|  7 |              Help |      admin |              help |         0 |
|  8 |             Pages |    content |             pages |         2 |
|  9 |             Media |    content |             media |         2 |
| 10 |          Articles |    content |          articles |         2 |
| 11 |            Menues |    content |            menues |         2 |
| 12 |         Templates |    content |         templates |         2 |
| 13 |            Themes |    content |            themes |         2 |
| 14 |              Blog |    content |              blog |         2 |
| 15 |             Forum |    content |             forum |         2 |
| 16 |      Core Modules |    modules |       core_module |         3 |
| 17 |      User Modules |    modules |       user_module |         3 |
| 18 |         All Users |      users |         all_users |         4 |
| 19 |            Groups |      users |            groups |         4 |
| 20 |       Permissions |      users |       permissions |         4 |
| 21 | Import and Export |      users |     import_export |         4 |
| 22 |        Send Email |      users |         send_mail |         4 |
| 23 |     Login Records |      users |     login_records |         4 |
| 24 |  General Settings |   settings |  general_settings |         5 |
| 25 |    Email Settings |   settings |    email_settings |         5 |
| 26 |   Popular Content |    reports |   popular_content |         6 |
| 27 | Most Active Users |    reports | most_active_users |         6 |
| 28 |     Documentation |       help |     documentation |         7 |
| 29 |             About |       help |             about |         7 |
| 30 |          Products |   products |           product |        17 |
| 31 |        Categories | categories |          category |        17 |
로그인 후 복사

목표는 단일 쿼리를 사용하여 ID가 ​​31(카테고리)인 항목의 모든 상위 항목을 찾는 것입니다. 이를 달성하기 위해 재귀 쿼리를 사용할 수 있습니다.

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;
로그인 후 복사

이 쿼리는 공통 테이블 표현식(CTE)을 사용하여 항목의 상위 항목을 반복적으로 검색합니다. vars 하위 쿼리는 각각 현재 항목의 ID와 재귀 수준을 나타내는 변수 @r 및 @l을 초기화합니다. 그런 다음 기본 하위 쿼리 T1은 재귀 쿼리를 사용하여 레벨을 증가시키면서 현재 항목의 상위 항목을 찾습니다.

마지막으로 T1 CTE는 메뉴 테이블 T2와 결합되어 각 항목의 세부 정보를 검색합니다. 부모 항목. ORDER BY T1.lvl DESC 절은 결과를 레벨 내림차순으로 정렬하여 가장 가까운 상위 항목이 먼저 표시되도록 합니다.

이 재귀 쿼리를 사용하면 다음과 같은 원하는 출력을 얻을 수 있습니다.

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 테이블에서 모든 상위 항목을 찾는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿