게시물 순서바꾸기 6

by 신제트 [SQL Query] [2022.04.04 15:20:54]


안녕하세요 

게시글의 순서를 바꿔보려고 합니다.

idx     sort     name

1          1          A

2          2          B

3          3          C

4          4          D

5          5          E

이렇게 DB값이 있다고 할때 sort 4->2로  바꿔서 노출순서를 바꿔주고싶은데 당연히 중복값은 없어야 합니다 4를 2로 2를 4로 한번만 바꾸는 쿼리문이 아니라

게시글에서 수정시 작성시 원하는 값으로 계속 순서를 바꿔주고 싶은데 방법이 있을까요? 

by 마농 [2022.04.04 15:32:16]

질문의 예시가 좀더 다양해야 합니다. Case 별로
원하는 최종 결과가 표현되어야 합니다.
sort 2 와 4 를 서로 맞바꾸는 것인지?
아니면 4가 2로 가면서 2,3 이 3,4 로 밀리는 것인지?
큰것을 작은 것으로 바꾸는 것만 있는지? 반대의 경우는 없는지?
등등. 가능한 모든 케이스별 원본 대비 결과를 표현해 주셔야 합니다.


by 신제트 [2022.04.04 15:42:50]

답변감사합니다.

UPDATE table_name SET sort=sort+1 where sort>".$get_sort."

UPDATE table_name A INNER JOIN (SELECT MIN(idx) AS idx FROM table_name GROUP BY sort HAVING COUNT(*)>1) B ON A.idx=B.idx SET A.sort=A.sort+1");

마농님 말씀처럼 기존에 제가 했던 방식은 4를 2로 바꾸었을때 2보다 작은값인 1을 제외한 나머지값들을 +1씩 시켜 주었습니다.

그러면 

idx     sort     name    ->        idx     sort     name

1          1          A                      1         1          A 

2          2          B                      2         3          B

3          3          C                      3         4          C

4          4          D                      4         2          D

5          5          E                       5        6           E

이런식으로 위의 쿼리문을 사용하여 기존의 2의값과 중복이 되어 IDX가 더작은값을 +1 해주는 방식으로 처리하였으나 빈값들이 생겨 이후 순서를 바꾸어줄때 숫자들을 다 암기 하고 그다음 값을 입력해야 하는 상황이 생겼습니다.

맞바꾸는 방식으로 수정 삭제시 가 가능하다면 제일 좋은 방법일 것같습니다.

반대의 경우도 있습니다 4->2 ,1->3 등 설명이 중구난방이였다면 죄송합니다. 

방법이 있다면 일러주시면 감사하겠습니다.


by 마농 [2022.04.04 15:49:49]
-- 앞쪽 순서로 당기는 경우 (4 --> 2)
UPDATE tt
   SET sort = CASE sort WHEN 4 THEN 2 ELSE sort + 1 END
 WHERE sort BETWEEN 2 AND 4
;
-- 뒷쪽 순서로 밀리는 경우 (2 --> 4)
UPDATE tt
   SET sort = CASE sort WHEN 2 THEN 4 ELSE sort - 1 END
 WHERE sort BETWEEN 2 AND 4
;

(다른 대안)
sort 를 1단위 인접한 수가 아닌 100 단위 수나, 소수점 형태로 관리하는 방안이 있습니다.
4 를 2 보다 먼저 출력하고 싶은 경우
4 를 2 로 바꾸고 2,3 을 1씩 뒤로 미루는게 아니라
4 를 1.5 로 바꾸는 방법입니다. (원하는 위치에 끼워 넣는 방식)
이렇게 되면 관련된 여러행을 바꿀 필요 없이 해당 라인만 변경하면 됩니다.
1단위 sort 는 row_number 를 이용해 별도 출력 가능합니다.
ROW_NUMBER() OVER(ORDER BY sort)
 


by 신제트 [2022.04.04 15:55:37]

답변 감사드립니다.

설명처럼 실행해 보겠습니다. 

그러나 

html에서 작성시 post ,수정시 put으로 값을 받아오는데 그 경우 위의 4와 2의 값에는 어떻게 값을 넣어야할까요?

 


by 신이만든지기 [2022.04.04 17:01:35]

 

-- 추가일 때
insert into table_name (idx, sort, name) values ( 6, 6.0, 'F');

-- 4번을 2번 보다 앞에 넣고자 할 때, 2번 바로 앞에 있는 값과 2번 sort값의 평균을 넣으면 될 것 같습니다.
-- 여기서는  (1.0 + 2.0) / 2  = 1.5
update table_name set sort = 1.5 where idx = 4;

-- 4번을 2번 보다 뒤에 넣고자 할 때, 2번 sort값과 2번 바로 뒤에 있는 sort값의 평균을 넣으면 될 것 같습니다.
-- 여기서는 ( 2.0 + 3.0 ) / 2 = 2.5 
update table_name set sort = 2.5 where idx = 4;
-- 평균값 구하는 쿼리
create table tmp (
id number,
sort number,
name varchar2(10)
);


insert into tmp values (1, 1.0, 'A');
insert into tmp values (2, 2.0, 'B');
insert into tmp values (3, 3.0, 'C');
insert into tmp values (4, 4.0, 'D');
insert into tmp values (5, 5.0, 'E');
insert into tmp values (6, 6.0, 'F');

select a.id, a.sort, b.sort prev_sort, c.sort next_sort
     , (a.sort + b.sort) / 2 before_sort_value
     , (a.sort + c.sort) / 2 after_sort_value
  from tmp a
     , (select max(sort) sort 
          from tmp 
         where sort < (select sort from tmp where id = 2)) b
     , (select min(sort) sort 
          from tmp 
         where sort > (select sort from tmp where id = 2)) c
 where id = 2;

 


by 신제트 [2022.04.04 20:13:08]

신이만든지기 님 감사합니다 참조해서 사용해 보겠습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입