MySQL에서 계층적 쿼리를 생성하려면 계층 구조가 어떻게 구축되는지 이해해야 합니다. 다음 예제 테이블을 고려하십시오.
id | 名称 | 父ID |
---|---|---|
19 | 类别1 | 0 |
20 | 类别2 | 19 |
21 | 类别3 | 20 |
22 | 类别4 | 21 |
이 테이블에서 parent_id
열은 특정 카테고리의 상위 카테고리 ID를 나타냅니다. 예를 들어 카테고리 2의 parent_id
값은 19로 이는 카테고리 1의 하위 카테고리임을 나타냅니다.
MySQL 8 이상의 경우 재귀적 WITH 구문을 사용할 수 있습니다.
<code class="language-sql">WITH RECURSIVE cte (id, name, parent_id) AS ( SELECT id, name, parent_id FROM products WHERE parent_id = 19 UNION ALL SELECT p.id, p.name, p.parent_id FROM products p INNER JOIN cte ON p.parent_id = cte.id ) SELECT * FROM cte;</code>
이 쿼리는 지정된 상위 ID(이 예에서는 19)에 대한 모든 하위 카테고리를 반복적으로 검색합니다. 출력에는 카테고리 1(id=19)에 직접 또는 간접적으로 속하는 모든 카테고리가 포함됩니다.
이전 MySQL 버전(5.x)의 경우 두 가지 대안이 있습니다.
인라인 변수:
<code class="language-sql">SELECT id, name, parent_id FROM (SELECT * FROM products ORDER BY parent_id, id) products_sorted, (SELECT @pv := '19') initialisation WHERE FIND_IN_SET(parent_id, @pv) AND LENGTH(@pv := CONCAT(@pv, ',', id));</code>
이 쿼리는 MySQL의 특정 기능을 활용하여 실행 중에 변수를 할당하고 수정합니다. @pv
변수를 상위 ID(이 경우 19)로 초기화하고 FIND_IN_SET
함수를 사용하여 parent_id
가 하위 항목 목록에 나타나는지 확인하면 하위 항목 ID 목록을 점진적으로 구축할 수 있습니다.
자체 연결:
<code class="language-sql">SELECT DISTINCT child.id, child.name, child.parent_id FROM products AS child JOIN products AS parent ON child.parent_id = parent.id WHERE parent.id = 19;</code>
이 쿼리는 셀프 조인을 사용하여 지정된 상위 ID(19)에서 시작하여 계층 구조를 탐색합니다. parent_id
열을 기반으로 하위 테이블을 상위 테이블과 조인하면 특정 상위의 모든 하위 항목을 재귀적으로 추출할 수 있습니다.
위 내용은 MySQL에서 계층적 재귀 쿼리를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!