programing

재귀적 CTE를 사용하여 레코드가 다른 레코드의 후손인지 확인

skycolor 2023. 9. 9. 09:15
반응형

재귀적 CTE를 사용하여 레코드가 다른 레코드의 후손인지 확인

다음 표에는 사용 설명서의 주제가 저장되어 있습니다.레코드를 제외한 각 항목에는 상위 항목이 있습니다.id1그것이 뿌리입니다.애플리케이션은 루트 토픽을 제외한 모든 토픽이 부모를 변경할 수 있도록 하고 있으며, 조상이 자신의 후손으로 할당되는 것을 방지해야 할 것입니다.

예를 들어 레코드 #2의 부모를 다음과 같이 변경해서는 안 됩니다.1로.7.

레코드가 다른 레코드의 후손인지 확인하려면 어떻게 해야 합니까?저는 후손들의 양을 "하드코드화"하고 싶지 않습니다.제가 mariaDB를 실제로 사용하고 있다는 것을 참고하세요.

CREATE TABLE IF NOT EXISTS `app`.`manual` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `content` TEXT NULL,
  `listorder` TINYINT NULL,
  `keywords` TEXT NULL,
  `display_list` TINYINT NULL,
  `parent_id` INT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_manual_manual1_idx` (`parent_id` ASC),
  CONSTRAINT `fk_manual_manual1`
    FOREIGN KEY (`parent_id`)
    REFERENCES `app`.`manual` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

id   parent_id
1    null
2    1
3    2
4    3
5    4
6    5
7    6

다음 쿼리는 다음과 같이 기록할 경우 0보다 큰 카운트를 반환합니다.id6은 의 기록의 후예입니다.id2의

WITH RECURSIVE ancestors AS (
SELECT * FROM manual WHERE id=2
UNION
SELECT m.*
FROM manual m
INNER JOIN ancestors a ON a.id=m.parent_id
)
SELECT COUNT(*) FROM ancestors WHERE id=6;

언급URL : https://stackoverflow.com/questions/49433253/determine-if-a-record-is-a-descendant-of-another-record-using-recursive-cte

반응형