我有一个MySQL表,其中的项目按等级分类:
fruit rank
banana 1
apple 2
cherry 3
raisin 4
pawpaw 5
让我们做一点切换,将木瓜改为位置2.这是我想要的桌子:
fruit rank
banana 1 # Unchanged
pawpaw 2 # -3
apple 3 # +1
cherry 4 # +1
raisin 5 # +1
如果我这样做香蕉,到位置3.我希望有这个表:
fruit rank
pawpaw 1 # -1
apple 2 # -1
banana 3 # +2
cherry 4 # Unchanged
raisin 5 # Unchanged
做一个算法来实现这个并不是很复杂。但是,我已经以非常简单和非优化的方式完成了它:
是否有一个优化的MySQL UPDATE命令可以执行此操作?
或者,或者,是否存在这种排序问题的数学公式,以避免使用大量条件?
答案 0 :(得分:2)
我建议将等级存储为10,20,30等,而不是1,2,3。
然后,您可以使用查询移动pawpaw
:
update items
set rank = 15
where fruit = 'pawpaw';
您可以使用以下方法重新规范化值:
set @rn := 0;
update items
set rank = (@rn := @rn + 10)
order by rank;
答案 1 :(得分:0)
您可以使用两个UPDATE查询来实现此目的:
UPDATE table
SET rank = to_rank
WHERE fruit = 'pawpaw';
UPDATE table
SET rank = rank + IF(from_rank > to_rank, 1, -1)
WHERE rank BETWEEN IF(from_rank > to_rank, to_rank, from_rank) AND IF(from_rank > to_rank, from_rank, to_rank)
AND fruit <> 'pawpaw'
这里有第一个查询,您可以将项目移动到新位置。而对于第二个,您可以在旧位置和新位置之间重新编号。