Jika jumlah perubahannya agak kecil, Anda dapat menghasilkan pernyataan UPDATE yang kikuk tetapi lebih efisien jika Anda mengetahui id dari item yang terlibat:
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;
atau (yang saya kurang suka):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
UPD :
Dengan asumsi bahwa Anda mengetahui id kategori saat ini (atau namanya), posisi lama, dan posisi barunya, Anda dapat menggunakan kueri berikut untuk memindahkan kategori ke bawah daftar (untuk naik, Anda harus mengubah between
kondisi dan new_rank
perhitungan ke 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;