对MYSQL表重新排序
我有一个带有“Order”字段的MySql表,但当记录被删除时,会出现一个间隙 如何按顺序更新“订单”字段? 如果可能,在一个查询中1对MYSQL表重新排序,mysql,sql,database,select,sql-order-by,Mysql,Sql,Database,Select,Sql Order By,我有一个带有“Order”字段的MySql表,但当记录被删除时,会出现一个间隙 如何按顺序更新“订单”字段? 如果可能,在一个查询中1 id.........order 1...........1 5...........2 4...........4 3...........6 5...........8 到 我可以一张一张地做这张唱片 获取按订单和逐行选择的订单更改订单字段 但是说实话,我不喜欢它 谢谢 额外信息: 我还想这样做: id.........order 1...........
id.........order
1...........1
5...........2
4...........4
3...........6
5...........8
到
我可以一张一张地做这张唱片
获取按订单和逐行选择的订单更改订单字段
但是说实话,我不喜欢它
谢谢
额外信息:
我还想这样做:
id.........order
1...........1
5...........2
4...........3
3...........3.5
5...........4
到
无需重新编号或重新订购。该表只提供了所有数据。如果您需要它以某种方式呈现,这就是查询的工作 您甚至不需要更改查询中的订单值,只需执行以下操作:
SELECT * FROM MyTable WHERE mycolumn = 'MyCondition' ORDER BY order;
无需重新编号或重新订购。该表只提供了所有数据。如果您需要它以某种方式呈现,这就是查询的工作 您甚至不需要更改查询中的订单值,只需执行以下操作:
SELECT * FROM MyTable WHERE mycolumn = 'MyCondition' ORDER BY order;
在MySQL中,您可以执行以下操作:
update t join
(select t.*, (@rn := @rn + 1) as rn
from t cross join
(select @rn := 0) const
order by t.`order`
) torder
on t.id = torder.id
set `order` = torder.rn;
在大多数数据库中,您也可以使用相关子查询来执行此操作。但这在MySQL中可能是个问题,因为它不允许将表更新为子查询:
update t
set `order` = (select count(*)
from t t2
where t2.`order` < t.`order` or
(t2.`order` = t.`order` and t2.id <= t.id)
);
在MySQL中,您可以执行以下操作:
update t join
(select t.*, (@rn := @rn + 1) as rn
from t cross join
(select @rn := 0) const
order by t.`order`
) torder
on t.id = torder.id
set `order` = torder.rn;
在大多数数据库中,您也可以使用相关子查询来执行此操作。但这在MySQL中可能是个问题,因为它不允许将表更新为子查询:
update t
set `order` = (select count(*)
from t t2
where t2.`order` < t.`order` or
(t2.`order` = t.`order` and t2.id <= t.id)
);
上面的答案很好,但我花了一段时间来摸索,因此我提供了一个轻微的重写,希望能更快地为其他人带来清晰:
update
originalTable
join (select originalTable.ID,
(@newValue := @newValue + 10) as newValue
from originalTable
cross join (select @newValue := 0) newTable
order by originalTable.Sequence)
originalTable_reordered
on originalTable.ID = originalTable_reordered.ID
set originalTable.Sequence = originalTable_reordered.newValue;
请注意,originalTable.*不是必需的-仅是用于最终联接的字段
我的示例假设要更新的字段名为Sequence,其意图可能比order更清楚,但主要是避开保留关键字的问题
我花了一段时间才明白原来答案中的const不是MySQL关键字。出于这个原因,我从来都不喜欢缩写词——缩写词有时可以有很多种解释,尤其是在最好不要被误解的时候。使我知道的代码冗长,但在我的书中,清晰总是胜过方便
我不太清楚select@newValue:=0的作用是什么,但我认为这是一个副作用,即必须先表示变量,然后才能在以后使用它
这个更新的价值当然是对所有相关行的原子更新,而不是实际地一行一行地进行数据拉取和更新
我的下一个问题,应该不难确定,但我已经了解到,SQL在最好的时候可能是一个诡计野兽,就是看看这是否可以在数据子集上安全地完成。其中某个originalTable.parentID是一个设置值 上面的答案非常好,但我花了一段时间来摸索,因此我提供了一个轻微的重写,希望能更快地为其他人带来清晰:
update
originalTable
join (select originalTable.ID,
(@newValue := @newValue + 10) as newValue
from originalTable
cross join (select @newValue := 0) newTable
order by originalTable.Sequence)
originalTable_reordered
on originalTable.ID = originalTable_reordered.ID
set originalTable.Sequence = originalTable_reordered.newValue;
请注意,originalTable.*不是必需的-仅是用于最终联接的字段
我的示例假设要更新的字段名为Sequence,其意图可能比order更清楚,但主要是避开保留关键字的问题
我花了一段时间才明白原来答案中的const不是MySQL关键字。出于这个原因,我从来都不喜欢缩写词——缩写词有时可以有很多种解释,尤其是在最好不要被误解的时候。使我知道的代码冗长,但在我的书中,清晰总是胜过方便
我不太清楚select@newValue:=0的作用是什么,但我认为这是一个副作用,即必须先表示变量,然后才能在以后使用它
这个更新的价值当然是对所有相关行的原子更新,而不是实际地一行一行地进行数据拉取和更新
我的下一个问题,应该不难确定,但我已经了解到,SQL在最好的时候可能是一个诡计野兽,就是看看这是否可以在数据子集上安全地完成。其中某个originalTable.parentID是一个设置值 为什么您的表中有重复的id?对不起,典型错误!通过重新编号,您试图解决的实际问题是什么?刚刚更正了字段顺序中的错误,有一个间隙3为什么您的表中有重复的id?对不起,典型错误!通过重新编号,您试图解决的实际问题是什么?刚刚更正了字段订单中的错误。在大多数情况下,存在差距3。我同意,但我希望能够操纵订单数据。在大多数情况下,我同意,但我希望能够操纵订单数据。这非常有效!谢谢!我用了你举的第一个例子。这使我的工作容易多了。我现在以10的增量运行它,给一个项目一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单!谢谢!我用了你提到的第一个例子
这让我的工作轻松多了。我现在以10的增量运行它,给一个项目一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个订单一个。