집 >데이터 베이스 >MySQL 튜토리얼 >단일 재귀 쿼리를 사용하여 MySQL 테이블에서 모든 상위 항목을 찾는 방법은 무엇입니까?
단일 쿼리(재귀 쿼리)를 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!