아래 구조와 같이 되어있는 테이블에서 

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


+ Recent posts