MySQL 자기참조 순환계층형 쿼리 정보
MySQL 자기참조 순환계층형 쿼리
본문
CREATE TABLE t_hierarchy ( id int(10) unsigned NOT NULL AUTO_INCREMENT, parent int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY ix_hierarchy_parent (parent, id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DELIMITER $$ CREATE PROCEDURE prc_fill_hierarchy (level INT, fill INT) BEGIN DECLARE _level INT; DECLARE _fill INT; INSERT INTO t_hierarchy (id, parent) VALUES (1, 0); SET _fill = 0; WHILE _fill < fill DO INSERT INTO t_hierarchy (parent) VALUES (1); SET _fill = _fill + 1; END WHILE; SET _fill = 1; SET _level = 0; WHILE _level < level DO INSERT INTO t_hierarchy (parent) SELECT hn.id FROM t_hierarchy ho, t_hierarchy hn WHERE ho.parent = 1 AND hn.id > _fill; SET _level = _level + 1; SET _fill = _fill + POWER(fill, _level); END WHILE; END $$ DELIMITER ; DROP FUNCTION IF EXISTS hierarchy_connect_by_parent_eq_prior_id; DELIMITER $$ CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE _id INT; DECLARE _parent INT; DECLARE _next INT; DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL; SET _parent = @id; SET _id = -1; IF @id IS NULL THEN RETURN NULL; END IF; LOOP SELECT MIN(id) INTO @id FROM t_hierarchy WHERE parent = _parent AND id > _id; IF @id IS NOT NULL OR _parent = @start_with THEN SET @level = @level + 1; RETURN @id; END IF; SET @level := @level - 1; SELECT id, parent INTO _id, _parent FROM t_hierarchy WHERE id = _parent; END LOOP; END $$ DELIMITER ; START TRANSACTION; CALL prc_fill_hierarchy(6, 5); COMMIT;
SELECT @r AS _id, ( SELECT @r := parent FROM t_hierarchy WHERE id = _id ) AS parent, @l := @l + 1 AS lvl FROM ( SELECT @r := 1218, @l := 0, @cl := 0 ) vars, t_hierarchy h WHERE @r <> 0
mysql 책 사서 봐야겠습니다...ㅠㅠ 이거 명확하게 설명해주실 분... ;ㅅ;
추천
0
0
댓글 6개
오~ 지도 책봐야 겠음다 ㅠ

이런 거는 그림을 보게는 좋죠.

그냥 데이터베이스 레코드를 트리구조로 저장하고 출력하고 하는거 같네요..
그걸 재귀함수로 만든거겠죠..
데이터 양이 많지 않다면..
그냥 다 불러들여서 PHP에서 하는게 훨씬 효율적일 겁니다.
전 이런구조는 메뉴나 카테고리에 쓰기때문에..
그냥 다 불러서 PHP에서 정렬하는게 훨씬 효율적이더라구요..
어차피 모든 레코드는 다 불러 들여야 할 상황이니..
데이터 양이 많고..
그중에 일부분만 불러내야 한다면 좀 틀리겠네요..
그걸 재귀함수로 만든거겠죠..
데이터 양이 많지 않다면..
그냥 다 불러들여서 PHP에서 하는게 훨씬 효율적일 겁니다.
전 이런구조는 메뉴나 카테고리에 쓰기때문에..
그냥 다 불러서 PHP에서 정렬하는게 훨씬 효율적이더라구요..
어차피 모든 레코드는 다 불러 들여야 할 상황이니..
데이터 양이 많고..
그중에 일부분만 불러내야 한다면 좀 틀리겠네요..

오라클에서 START WITH~ CONNECT BY PRIOR~ 라는 유용한 함수가 있다길래 mysql에서는 가능할까 해서 검색해봐서 나온 결과인데요. 조직도에서 사용해보려고 했는데... 어렵네요 ㅠㅠ


네 해당 페이지 내용 맞습니다..ㅠㅠ