안녕하세요
게시글의 순서를 바꿔보려고 합니다.
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로 한번만 바꾸는 쿼리문이 아니라
게시글에서 수정시 작성시 원하는 값으로 계속 순서를 바꿔주고 싶은데 방법이 있을까요?
질문의 예시가 좀더 다양해야 합니다. Case 별로
원하는 최종 결과가 표현되어야 합니다.
sort 2 와 4 를 서로 맞바꾸는 것인지?
아니면 4가 2로 가면서 2,3 이 3,4 로 밀리는 것인지?
큰것을 작은 것으로 바꾸는 것만 있는지? 반대의 경우는 없는지?
등등. 가능한 모든 케이스별 원본 대비 결과를 표현해 주셔야 합니다.
답변감사합니다.
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 등 설명이 중구난방이였다면 죄송합니다.
방법이 있다면 일러주시면 감사하겠습니다.
-- 앞쪽 순서로 당기는 경우 (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)
답변 감사드립니다.
설명처럼 실행해 보겠습니다.
그러나
html에서 작성시 post ,수정시 put으로 값을 받아오는데 그 경우 위의 4와 2의 값에는 어떻게 값을 넣어야할까요?
-- 추가일 때 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;
신이만든지기 님 감사합니다 참조해서 사용해 보겠습니다!