Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对MySQL表中的行重新排序_Mysql_Sql - Fatal编程技术网

对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>));