아래 구조와 같이 되어있는 테이블에서
Drag & Drop 으로 특정 항목의 위치를 변경 하였을 때
순서를 재 정렬 해주는 쿼리 입니다.
ex) [크롤링] 항목을 3번째 로 이동할 경우
i_to_position = 3, i_from_position = 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | CREATE DEFINER=`root`@`%` PROCEDURE `sp_upd_category_order`( IN i_id varchar(20) , IN i_group_code int , IN i_to_position int , IN i_from_position int , OUT o_result int ) DETERMINISTIC BEGIN /* 카테고리 정렬 순서 변경 */ set o_result = -1; -- 지정 카테고리의 순번을 i_to_position 로 설정 update tbl_group_info set ordinal_position = i_to_position where id=i_id and group_code = i_group_code ; -- 기준 순서 위쪽 정렬 update tbl_group_info ta inner join ( select id, group_code, (@rownum := @rownum +1) num from tbl_group_info, (select @rownum := 0) ta where id=i_id and group_code!=i_group_code and ordinal_position < i_to_position+i_from_position order by ordinal_position asc ) tb on ta.id = tb.id and ta.group_code=tb.group_code set ta.ordinal_position = tb.num; -- 기준 순서 아래쪽 정렬 update tbl_group_info ta inner join ( select id, group_code, (@rownum := @rownum +1) num from tbl_group_info, (select @rownum := 0) ta where id=i_id and group_code!=i_group_code and ordinal_position >= i_to_position order by ordinal_position asc ) tb on ta.id = tb.id and ta.group_code=tb.group_code set ta.ordinal_position = tb.num + i_to_position; set o_result = 1; END | cs |