상위 ID가 하위 ID보다 낮아야하는 문제없이 SELECT를 할 수 있도록하려면 함수를 사용할 수 있습니다. 또한 여러 자식을 지원하며 (트리가해야하는 것처럼) 트리는 여러 머리를 가질 수 있습니다. 또한 데이터에 루프가 있으면 중단됩니다.
동적 SQL을 사용하여 테이블 / 열 이름을 전달할 수 있기를 원했지만 MySQL의 함수는이를 지원하지 않습니다.
DELIMITER $$
CREATE FUNCTION `isSubElement`(pParentId INT, pId INT) RETURNS int(11)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE isChild,curId,curParent,lastParent int;
SET isChild = 0;
SET curId = pId;
SET curParent = -1;
SET lastParent = -2;
WHILE lastParent <> curParent AND curParent <> 0 AND curId <> -1 AND curParent <> pId AND isChild = 0 DO
SET lastParent = curParent;
SELECT ParentId from `test` where id=curId limit 1 into curParent;
IF curParent = pParentId THEN
SET isChild = 1;
END IF;
SET curId = curParent;
END WHILE;
RETURN isChild;
END$$
여기에서 테이블 test
을 실제 테이블 이름으로 수정해야하며 열 (ParentId, Id)을 실제 이름으로 조정해야 할 수 있습니다.
사용법 :
SET @wantedSubTreeId = 3;
SELECT * FROM test WHERE isSubElement(@wantedSubTreeId,id) = 1 OR ID = @wantedSubTreeId;
결과 :
3 7 k
5 3 d
9 3 f
1 5 a
테스트 생성을위한 SQL :
CREATE TABLE IF NOT EXISTS `test` (
`Id` int(11) NOT NULL,
`ParentId` int(11) DEFAULT NULL,
`Name` varchar(300) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into test (id, parentid, name) values(3,7,'k');
insert into test (id, parentid, name) values(5,3,'d');
insert into test (id, parentid, name) values(9,3,'f');
insert into test (id, parentid, name) values(1,5,'a');
insert into test (id, parentid, name) values(6,2,'o');
insert into test (id, parentid, name) values(2,8,'c');
편집 : 여기에 직접 테스트 하는 바이올린 이 있습니다. 사전 정의 된 구분 기호를 사용하여 구분자를 변경해야했지만 작동합니다.