Nếu số lượng thay đổi khá nhỏ, bạn có thể tạo một câu lệnh UPDATE vụng về nhưng khá hiệu quả nếu bạn biết id của các mục liên quan:
UPDATE categories
JOIN (
SELECT 2 as categoryID, 3 as new_order
UNION ALL
SELECT 3 as categoryID, 4 as new_order
UNION ALL
SELECT 4 as categoryID, 2 as new_order) orders
USING (categoryId)
SET `order` = new_order;
hoặc (mà tôi ít thích hơn):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
CẬP NHẬT :
Giả sử rằng bạn biết id hiện tại của danh mục (hoặc tên của nó), vị trí cũ và vị trí mới của nó, bạn có thể sử dụng truy vấn sau để di chuyển một danh mục xuống danh sách (để di chuyển lên, bạn sẽ phải thay đổi between
điều kiện và new_rank
tính toán đến rank+1
):
SET @id:=2, @cur_rank:=2, @new_rank:=4;
UPDATE t1
JOIN (
SELECT categoryID, (rank - 1) as new_rank
FROM t1
WHERE rank between @cur_rank + 1 AND @new_rank
UNION ALL
SELECT @id as categoryID, @new_rank as new_rank
) as r
USING (categoryID)
SET rank = new_rank;