在切换值后重新计算位置的非平凡方式

时间:2014-11-07 12:54:33

标签: mysql math

我有一个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

做一个算法来实现这个并不是很复杂。但是,我已经以非常简单和非优化的方式完成了它:

  1. 获取水果表中的所有内容;
  2. 用一堆条件计算PHP中的新排名;
  3. 用新的排名更新水果表。
  4. 是否有一个优化的MySQL UPDATE命令可以执行此操作?

    或者,或者,是否存在这种排序问题的数学公式,以避免使用大量条件?

2 个答案:

答案 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'

这里有第一个查询,您可以将项目移动到新位置。而对于第二个,您可以在旧位置和新位置之间重新编号。