[ppas query]
WITH RECURSIVE help_page(help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, help_location, parent_id, show_type, depth_level, menu_seq) AS ( SELECT hm.help_id, hm.help_name, hm.help_page, hm.help_tag, hm.help_main_key, hm.help_sub_key, concat(hm.help_name) as help_location, hm.parent_id, hm.show_type, 0 as depth_level, lpad(concat(hm.menu_seq),3,'0') as menu_seq FROM tb_m00s22_help_meta hm WHERE hm.parent_id is null or hm.parent_id = '' UNION ALL SELECT hm.help_id, hm.help_name, hm.help_page, hm.help_tag, hm.help_main_key, hm.help_sub_key, hp.help_location || ' > ' || concat(hm.help_name) as help_location, hm.parent_id, hm.show_type, depth_level + 1 as depth_level, hp.menu_seq || '-' || lpad(concat(hm.menu_seq),3,'0') as menu_seq FROM tb_m00s22_help_meta hm INNER JOIN help_page AS hp ON hm.parent_id = hp.help_id ) SELECT * FROM help_page ORDER BY menu_seq
[mysql query]
select original_value as help_id, help_location, depth_level, menu_seq from ( select @ov as original_value, help_id, help_location, depth_level, menu_seq from ( select t.help_id as help_id, @pv:=t.parent_id as parent_id, t.help_name , @pv2:=(case when @pv2 = '' then concat(t.help_name,@pv2) else concat(t.help_name,' > ',@pv2) end) as help_location , (@rownum := @rownum+1) as depth_level , @menu_seq:=(case when @menu_seq = '' then concat(t.menu_seq,@menu_seq) else concat(t.menu_seq,'-',@menu_seq) end) as menu_seq from (select help_id, parent_id, help_name, lpad(concat(menu_seq),3,'0') as menu_seq from tb_m00s22_help_meta order by help_id desc LIMIT 100000) t join (select @ov:='H300020006', @pv:='H300020006', @pv2:='', @rownum:=-1, @menu_seq:='' ) tmp where t.help_id = @pv ) tt order by help_id asc limit 1 ) ttt
** mysql은 subquery에서 orderby를 했는데, 외부로 나오면 다시 orderby가 원복된다.
limit를 사용하면 정렬이 유지된다.
https://mariadb.com/kb/en/library/why-is-order-by-in-a-from-subquery-ignored/
[select query]
select help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, FN_SPLIT(help_data,'|',1) as help_location, parent_id, show_type, FN_SPLIT(help_data,'|',2) as depth_level, FN_SPLIT(help_data,'|',3) as menu_seq from ( select help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, parent_id, show_type,FN_GET_HELP_DATA(help_id) as help_data from tb_m00s22_help_meta ) t
[mysql function]
DELIMITER $$ CREATE DEFINER=`poswork`@`%` FUNCTION `FN_GET_HELP_DATA`(pv_help_id varchar(50)) RETURNS varchar(1000) CHARSET utf8 DETERMINISTIC BEGIN DECLA RE v_pv_help_id varchar(50); DECLA RE v_ori_help_id varchar(500); DECLA RE v_help_location varchar(500); DECLA RE v_depth_level varchar(500); DECLA RE v_menu_seq varchar(500); DECLA RE v_rtn_value varchar(1000); DECLA RE EXIT HANDLER FOR NOT FOUND RETURN null; SET v_pv_help_id = pv_help_id; IF v_pv_help_id IS NULL OR v_pv_help_id = '' THEN RETURN null; END IF; select original_value as help_id, help_location, depth_level, menu_seq INTO v_ori_help_id,v_help_location,v_depth_level,v_menu_seq from ( select @ov as original_value, help_id, help_location, depth_level, menu_seq from ( select t.help_id as help_id, @pv:=t.parent_id as parent_id, t.help_name , @pv2:=(case when @pv2 = '' then concat(t.help_name,@pv2) else concat(t.help_name,' > ',@pv2) end) as help_location , (@rownum := @rownum+1) as depth_level , @menu_seq:=(case when @menu_seq = '' then concat(t.menu_seq,@menu_seq) else concat(t.menu_seq,'-',@menu_seq) end) as menu_seq from (select help_id, parent_id, help_name, lpad(concat(menu_seq),3,'0') as menu_seq from tb_m00s22_help_meta order by help_id desc LIMIT 100000) t join (select @ov:=v_pv_help_id, @pv:=v_pv_help_id, @pv2:='', @rownum:=-1, @menu_seq:='') tmp where t.help_id = @pv ) tt order by help_id asc limit 1 ) ttt; SET v_rtn_value = concat(v_help_location,'|',v_depth_level,'|',v_menu_seq); RETURN v_rtn_value; END$$ DELIMITER ;
[split function]
DELIMITER $$ CREATE DEFINER=`poswork`@`%` FUNCTION `FN_SPLIT`(srcvalue varchar(500), split_char varchar(50), split_index int) RETURNS varchar(500) CHARSET utf8 DETERMINISTIC return if(srcvalue is null or srcvalue = '',null,substring_index(substring_index(srcvalue,split_char,split_index),split_char,-1))$$ DELIMITER ;