단일 쿼리(재귀 쿼리)를 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!