> 데이터 베이스 > MySQL 튜토리얼 > MySQL에서 계층적 재귀 쿼리를 만드는 방법은 무엇입니까?

MySQL에서 계층적 재귀 쿼리를 만드는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-25 16:02:14
원래의
889명이 탐색했습니다.

How to Create Hierarchical Recursive Queries in MySQL?

MySQL에서 계층적 재귀 쿼리 생성

계층구조의 이해

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

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 솔루션: 인라인 변수 또는 셀프 조인

이전 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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