2014-12-10 6 views
1

무의미한 제목의 일은 유감스럽게 생각합니다.하지만 더 적합한 것은 아닙니다. 나는 다음과 같습니다 (초) (첫번째) dimensionorder_by에 의해 주문한 모든 항목을 나열하고MySQL - 변수 증분을 사용한 순차적 재정렬 알고리즘/업데이트

SELECT * FROM `table` 

+----+-----------+----------+-------+ 
| id | dimension | order_by | value | 
+----+-----------+----------+-------+ 
| 1 |  1  |  1 | 1st | 
| 2 |  1  | 100 | 3rd | 
| 3 |  2  | 300 | 5th | 
| 4 |  3  | 999 | 6th | 
| 5 |  1  |  2 | 2nd | 
| 6 |  2  |  1 | 4th | 
+----+-----------+----------+-------+ 

:


나는이처럼 보이는 MySQL의 테이블을 가지고

SELECT * FROM `table` ORDER BY `dimension`, `order_by` 

+----+-----------+----------+-------+ 
| id | dimension | order_by | value | 
+----+-----------+----------+-------+ 
| 1 |  1  |  1 | 1st | 
| 5 |  1  |  2 | 2nd | 
| 2 |  1  | 100 | 3rd | 
| 6 |  2  |  1 | 4th | 
| 3 |  2  | 300 | 5th | 
| 4 |  3  | 999 | 6th | 
+----+-----------+----------+-------+ 

이제 가능하면 하나만 사용하여 order_by을 재정렬하는 함수를 작성하고 싶습니다. 내가 (각 차원에 대해 이야기하는, 불행하게도, 시작하지 않는) 지금까지 가지고 무엇

SELECT * FROM `table` ORDER BY `dimension`, `order_by` 

+----+-----------+----------+-------+ 
| id | dimension | order_by | value | 
+----+-----------+----------+-------+ 
| 1 |  1  |  1 | 1st | 
| 5 |  1  |  2 | 2nd | 
| 2 |  1  |  3 | 3rd | 
| 6 |  2  |  1 | 4th | 
| 3 |  2  |  2 | 5th | 
| 4 |  3  |  1 | 6th | 
+----+-----------+----------+-------+ 

: : 이제

UPDATE `table` AS `l` 
JOIN (SELECT @i=1 FROM `table`) AS `i` 
SET `order_by` = @i:=i 

, 내 질문이 될 것 update 쿼리, 그것은 그런 식으로 보이게하기 : 하나의 UPDATE 쿼리만으로 가능합니까?

답변

2

이전 행의 값을 보유하는 다른 변수를 도입해야합니다.

UPDATE Table1 t 
INNER JOIN (
    SELECT 
    id, /*your primary key I assume*/ 
    @new_ob:=if(@prev != dimension, 1, @new_ob + 1) as new_ob, 
    @prev := dimension /*In this line, the value of the current row is assigned. In the previous line, the variable still holds the value of the previous row*/ 
    FROM 
    Table1 
    , (SELECT @prev := null, @new_ob := 0) var_init_subquery 
    ORDER BY dimension, order_by 
) st ON t.id = st.id 
SET t.order_by = st.new_ob; 
라이브 작업 참조