代码之家  ›  专栏  ›  技术社区  ›  okoman

删除后更新排序键

  •  2
  • okoman  · 技术社区  · 16 年前

    我有一张有田地的桌子 sort_id . 在这个字段中有从1到n的数字,它们定义了数据集的顺序。 现在我想删除一些元素,然后我想重新排序表。因此,我需要一个查询来“找到”差距并更改 小精灵 根据修改字段。

    当然,我可以这样做:

    SELECT sort_id FROM table WHERE id = 5
    

    然后保存分类ID,然后:

    DELETE FROM table WHERE id = 5
    UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above}
    

    但我想一步完成重新排序过程。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Bill Karwin    16 年前

    马登和阿沃有很好的想法,但不幸的是,在MySQL你不能。 SELECT UPDATE 同一语句中的同一个表(甚至在子查询中)。这是mysql的已知限制。

    下面是一个使用mysql用户变量的解决方案:

    SET @i := 0;
    UPDATE mytable
    SET sort_id = (@i := @i + 1)
    ORDER BY sort_id;
    

    不管怎样,我都不会费心做这件事。如果你 sort_id 仅用于排序,而不用作“行号”的一种,则删除其中的行后,行仍按排序顺序排列 id=6 . 这些值不一定要连续才能排序。

        2
  •  0
  •   Mladen Prajdic    16 年前

    对于SQL Server 2005: 这就是获得新序列的方法:

    SELECT row_number() over(order by sort_id) as RN
    FROM table
    

    更新表意味着您应该将该select加入到您的更新中:

    update t1
    set sort_id = t2.RN
    FROM table t1 
         join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
            on t1.UniqueId = t2.UniqueId
    
        3
  •  0
  •   Arvo    16 年前

    我不知道mysql的语法变化,也不能实时测试查询,但像next这样的东西应该至少能给你一个想法:

    update table t1
    set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)