문제

MySQL에 기록 테이블이 있습니다. 사용자가 지정한대로 주문을 유지해야합니다. 그래서 '위치'열을 추가했습니다.

특정 레코드를 이동할 때 모든 레코드를 업데이트하는 SQL 문은 무엇입니까? 나는 다음과 같은 것을 가지고있다.

UPDATE items SET position = '2' WHERE id ='4';
UPDATE items SET position = position+1 WHERE position >= '2' AND id != '4';

그러나 레코드가 무너 졌을 때보 다 적을수록 트릭은 무엇입니까? 감사!

도움이 되었습니까?

해결책

사용자가 유지 관리하는 줄 번호로 판매 주문을 위해 이런 종류의 작업을 수행하면 BL 또는 UI의 배열에서 처리하는 것이 가장 좋습니다. 일반적으로 그들은 여러 레코드를 조정하기를 원하며 때로는 "잊어 버리기"라고 말하고 싶어합니다. 따라서 가장 쉬운 것은 "OK"버튼 (또는 동등한)을 누른 다음 현재 주문으로 다시 작성하는 것입니다.

결국 삭제를 다룰 수 있습니다. 이는 같은 방식으로 처리 할 수있는 또 다른 문제입니다.

다른 팁

이런 일이 그렇게 될까요?

UPDATE items 
SET position = CASE position 
  WHEN $oldpos THEN $newpos 
  ELSE position + SIGN($oldpos-$newpos)
 END
WHERE position BETWEEN LEAST( $newpos, $oldpos ) 
                AND GREATEST( $newpos, $oldpos );

나는 그것을 두 번 테스트했고 작동하는 것 같습니다.

이것은 이것에 대한 나의 취향입니다 : 내 row_index 열에는 10의 단계가있는 숫자가 있습니다 (예 : 0, 10, 20, ECC.). 사용자가 행 중 하나를 업데이트하면 행 또는 아래로 가고 있는지 알아야합니다. 두 번째 행을 4 번째로 옮겨야한다면 (아래로, 원하는 row_index = 30), row_index를 35로 설정합니다. 그렇지 않으면 (올라가는 경우) 25로 설정하십시오.이 값을 설정하십시오.

UPDATE your_table SET row_index = 35 WHERE your_id = 1234

이제 올바른 순서가 있지만 row_indexes가 엉망입니다. 이 문제를 해결하려면이 두 쿼리를 실행하십시오.

SET @pos:=-10;
UPDATE your_table SET row_index = @pos:=@pos+10 WHERE ...

이것은 모든 행 (또는 WHER 문으로 선택한 행)을 업데이트하고 갭없이 Row_Index 열을 설정합니다 (0, 10, 20, 30, ECC.). 분명히 이런 식으로 쓰기 작업에로드를 추가하지만 읽기 작업 중에 주문을 얻는 가장 빠른 방법이라고 생각합니다. 행을 삭제하면 수정 순서 쿼리를 다시 실행할 수 있습니다.

최소한 항목 사이에 큰 증분 (10000)을 사용하여 최소한을 제안합니다. 그냥 주문을합니다. 11000에서 9000에서 10000 사이를 이동 해야하는 경우 9500으로 설정하고 완료하십시오.

이것은 재정렬 문제를 제거하지 않지만 크게 줄어 듭니다. 어느 시점에서 모든 행을 삭제 한 다음 올바른 순서로 읽는 것이 좋습니다. 당신이하는 것처럼 업데이트를하는 것은 너무 오류가 발생하기 쉬운 일입니다.

링크 된 목록 유형의 접근 방식을 사용하고 다음의 키와 목록의 이전 항목을 사용하는 것을 고려하면 모든 레코드 대신 몇 가지 레코드 만 업데이트하면됩니다.

흥미로운! 좋아요, 쉬운 대답이 없습니다. 나는 내가 뭔가를 놓치고 있다고 생각했다. 외부 배열을 유지하는 것에 대해 생각했습니다. 그것은 최고의 아이디어처럼 들립니다.

아마도 이렇게?

$item_id = $_GET['item_id']; 
$position = $_GET['new_position']; 
$old_position = $_GET['old_position'];

if($new_position < $old_position) {
    SQL: UPDATE items SET position = position+1 WHERE position >= $new_position AND position < $old_position  
} else {  
SQL: UPDATE items SET position = position-1 WHERE position <= $new_position AND position > $old_position
}  

SQL: UPDATE items SET position = $new_position WHERE item_id = $item_id 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top