对MySQL表中的行重新排序
我有一张桌子:对MySQL表中的行重新排序,mysql,sql,Mysql,Sql,我有一张桌子: +--------+-------------------+-----------+ | ID | Name | Order | +--------+-------------------+-----------+ | 1 | John | 1 | | 2 | Mike | 3 | | 3 | Daniel
+--------+-------------------+-----------+
| ID | Name | Order |
+--------+-------------------+-----------+
| 1 | John | 1 |
| 2 | Mike | 3 |
| 3 | Daniel | 4 |
| 4 | Lisa | 2 |
| 5 | Joe | 5 |
+--------+-------------------+-----------+
管理员可以更改订单,因此可以更改订单列。在管理端,我有一个表单,在数据库条目之后插入一个选择框。我应该使用什么查询在插入的列后排序+1
我希望这样做可以将服务器负载保持在最低限度,因为这个表目前有1200行。这是保存表顺序的正确方法还是有更好的方法
谢谢你的帮助
编辑:
这是我想做的,多亏了它,马特:
要将第1行重新排序为第1100行之后的行,您计划将第2-1100行保留不变,然后将第1行修改为1101,并增加1101-1200只需以任何正常方式添加新行,然后让以后的用户选择使用ORDER BY进行排序。按照MySQL标准,1200行是无限小的。您真的不必也不想让物理表保持排序。相反,使用键和索引访问表的方式可以满足您的需要 你可以
insert into tablename (name, `order`)
values( 'name', select `order`+1 from tablename where name='name')
您还可以在内部选择中选择id=id\u val
希望这就是你想要的,问题并不完全清楚。你需要分两步来完成:
UPDATE MyTable
SET `Order` = `Order` + 1
WHERE `Order` > (SELECT `Order`
FROM MyTable
WHERE ID = <insert-after-id>);
…这将使列表中每一行的订单号比您要插入的人下移得更远
然后:
若要插入新行,假设ID是自动递增的,订单号比要插入的人多一个。因此,如果要将第1行重新排序为第1100行之后,您计划保持第2-1100行不变,然后将1修改为1101并递增1101-1200?我只是想知道你想要什么。更改订单号明智吗?我认为这可能会导致混淆。这不会像给定的那样工作,因为order是SQL中的保留关键字。您需要将其包装成反勾号,使MySQL将其视为字段名而不是关键字。使用maxorder怎么样+1@diEcho:这将在单连接系统上工作,但并行运行此查询时会遇到并发问题。-1此查询将不工作,a:选择将选择多行,将insert语句从B:limit 1中抛出将不会有帮助,因为这只会选择一个不确定的行C:order by'order'DESC limit 1在大多数情况下都会工作,但如果并行运行查询,则会遇到并发问题。如果出现此错误,则无法为从中更新指定目标表“test_cat”clause@LeePrice,您需要在另一个子选择中包围该子选择,如下所示:。。。where order>select*from select order from mytable,其中id=。。。MySQL的方式很奇怪,现在我明白了:每个派生表都必须有自己的别名:/
INSERT INTO MyTable (Name, `Order`)
VALUES (Name, (SELECT `Order` + 1 FROM MyTable WHERE ID = <insert-after-id>));