사용하는 db는 postgres
A라는 table이 있고
A 테이블에는
id (int, primary key)
order (int array)
이 있음
구현하고자하는 기능은
/12/up/7 이라는 request가 오면
우선 12로 해당 row를 찾아서
그 row의 order 값이 {4, 7, 1, 2} 라고 하면 (중복없음)
{7, 4, 1, 2} 가 돼야함
즉 원소 7의 위치가 한단계 증가함
또 /12/up/7 이라는 request가 오면
7은 더이상 올라갈 자리가 없으니
{7, 4, 1, 2} 그대로
쿼리 한번만에 해결해야됨
근데 또 궁금한게 하나의 쿼리라도 그 안에 서브쿼리같은게 여러개 있을 수 있는데
서브쿼리가 실패했을 때 다시 롤백이 알아서 됨?
1/ 선생님 제발 글을 먼저 읽으시고 댓글을 다세요
얌마 니가 왜 이런게 필요해? 일반 sql 영역이 아닌데? 스토어드 프로시져가 필요한 삘인데... 니 수준 상 절대 풀수있는게 아닐껀데
아니 아시면 짜주시던가요 왜 화를 ㄴ ㅐ시냐고요
이거이거 xy 문제 삘인디... ㅋㅋㅋ
rdbms에서 order 구현하기위해서 이런 문제 꽤 많이 대두됐을거같은데 안될리가 없다고요
create table tt(t integer[]); insert into tt values ('{4,7,1,2}'); select * from tt; select array_agg(r) from (select r from (select unnest(t) as r from tt) as aa where r = 2 union all select r from (select unnest(t) as r from tt) as rt where r != 2) as f; drop table tt;
답풀리면 형한테 기프티콘 보내라
1/ 고마워 근데 쿼리날려봤는데 4 7 1 2 => 2 4 7 1 이 되는데?
그건 내가 r을 2로 세팅 해놨기 때문이다 4로 바꾸고 해보아라 참고로 두군데다
내가볼때 이런 형식의 쿼리로는 무조건 특정 원소를 가장 앞으로 이동시키거나 가장 뒤로이동시키는것밖에 안되는거같은데.. 난 한단계만 증가하길 ㅇ원함
물론 내가멍청해서 내가볼때..임
아이디어를 제공할뿐이다 실무에 저딴쿼리를 쓰면 필히 욕을 먹을것이다
ㄳㄳ 이거 개선할순없을까? 쓰레기같이 짜봤는데
http://gall.dcinside.com/board/view/?id=programming&no=627884
이런 문제에서 쿼리에서 모든것을 해결하려고하는것은 미련한 짓이다
그럼 어떻게해
저 쿼리 이상으로 복잡해진다면 어플리케이션에서 처리하는게 훨씬 수월한 방법이다
안돼 db에 아이템 order를 저장해야되는데 동시에 여러사람이 작업해도 데이터가 유효하도록 해야한단말이야
클라이언트단에서 그 배열을 받아서 그 배열을 통짜로 보내면 필연적으로 데이터손실이 발생할거고
그말은 같은 row에 대해 동시에 다른 클라이언트가 변경요청을 할 수 있다는 얘기냐?
요구사항이 정확히 뭔지 몰라서 더 큰 얘기는 해줄 수 없겠다 쿼리로 꼭 해결해야 한다면 postgresql에서 제공하는 array_function으로 어찌저찌 해볼수는 잇을것이다 디버깅이 더러워서 좋은 방법은 아니다
웹서비스에 대한 db라 동시에 여러사람이 접속할 수 있고, 해당 array는 언제든 원소가 추가,삭제,reordring(본문의 기능)이 발생할 수 있어
만약 클라이언트단에서 처리한다고 하는 경우에, A 클라이언트가 [1,2,3] 이라는 배열을 받아 [3,1,2]로 reordering해서 보냈는데, 그 사이에 B 클라이언트가 [1,2,3,4] 라는 배열을 보냈으면 4라는 데이터가 손실되겠징
그리고 array_function으로 어찌저찌해본게 저기 위에 링크
그런 데이터의 변경현상은 꼭 db에서만 발생하는것이 아니다 db에서 작업을 잘 해놓아도 클라이언트 서버구조에서는 항상 발생할수 있는 문제인것이다 정말 크리티컬한 정보라면 정보가 변경되는 즉시 클라이언트에 알려주어야 한다. 알려주어도 시간차는 발생할 수 있으므로 validation을 걸고 내가 변경하려고 하는 정보가 내가 알고 있는 정보가 맞느냐를 검사해야만 한다. 따라서 단순업데이트로는 쿼리를 한방에 짜도 니가 말한 문제가 언제든지 발생할수 있느니라222.109.*.*
좋은정보 ㄳ아재요