-1

这是一个 MySQL 问题:

我有一个具有以下结构的表。

reference
position
parent

每个项目都应该有一个位置,每个位置只能使用一次。位置应该增加(所以如果有 40 个项目,那么位置应该从 1 到 40)。

然而,这个表中的数据到处都是(同一个位置被多次使用,有些行没有位置)。我想通过重新索引位置来重置表格。我想在这样做时尊重现有的订单(即使它们并不完美)(如果可能的话 - 如果不是,可以丢弃这些职位)。

------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|ASHDFNS          |2                   |89            |
|BSHDFNS          |2                   |89            |
|CSHDFNS          |1                   |89            |
|DSHDFNS          |100                 |89            |
|ESHDFNS          |8                   |89            |
|FSHDFNS          |22                  |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |22                  |11            |
|CSHDFNS          |333                 |11            |
|-----------------|--------------------|--------------|

期望的

-------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|CSHDFNS          |1                   |89            |
|ASHDFNS          |2                   |89            |
|BSHDFNS          |3                   |89            |
|ESHDFNS          |4                   |89            |
|FSHDFNS          |5                   |89            |
|DSHDFNS          |6                   |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |2                   |11            |
|CSHDFNS          |3                   |11            |
|-----------------|--------------------|--------------|

编辑:对不起,简单地自动增加位置列将不起作用,因为该表描述了多个父项中项目的位置(并且项目可以有多个父项)

4

1 回答 1

1

创建具有相似架构的表,但将列位置设置为 auto_increment

在从 old_table 插入之后,按您想要的任何顺序

insert into new_table select reference, 0, parent from old_table 
order by if (position is null, 99999, position);

之后,重命名 old_table,将 new_table 重命名为 old_table

否则,定义一个用户变量来表示位置

像这样-更新和选择mysql中的同一张表问题

或者这个 -更新列,使其包含行位置

于 2011-03-04T16:30:46.563 回答