重新排序MySQL表中的行

时间:2011-10-04 14:07:37

标签: mysql sql

我有一张桌子:

+--------+-------------------+-----------+
| ID     | Name              |  Order    |
+--------+-------------------+-----------+
| 1      | John              | 1         |
| 2      | Mike              | 3         |
| 3      | Daniel            | 4         |
| 4      | Lisa              | 2         |
| 5      | Joe               | 5         |
+--------+-------------------+-----------+

订单可以由管理员更改订单栏。在管理员方面,我有一个表单,其中包含对数据库条目的选择框Insert After:。在插入的列之后,我应该使用什么查询来订购+ 1.

我想以这样的方式执行此操作,以便将服务器负载降至最低,因为此表目前有1200行。这是保存表格顺序的正确方法还是有更好的方法?

任何帮助表示赞赏

修改

这就是我想要做的,感谢它的匹配:

想要将第1行重新排序为第1100行之后,您计划将2-1100保留为相同,然后将1修改为1101并增加1101-1200

3 个答案:

答案 0 :(得分:6)

您需要分两步完成此操作:

UPDATE MyTable 
   SET `Order` = `Order` + 1 
 WHERE `Order` > (SELECT `Order` 
                    FROM MyTable 
                   WHERE ID = <insert-after-id>);

...这会将列表中每一行的订单号移动到您插入的人之后。

然后:

INSERT INTO MyTable (Name, `Order`)
VALUES (Name, (SELECT `Order` + 1 FROM MyTable WHERE ID = <insert-after-id>));

要插入新行(假设ID为自动增量),订单号比您之后插入的人多一个。

答案 1 :(得分:1)

只需以任何正常方式添加新行,并让稍后的SELECT使用ORDER BY进行排序。根据MySQL标准,1200行是无限小的。您真的不必(并且不希望)保持物理表排序。而是使用键和索引来访问表,以便为您提供所需的内容。

答案 2 :(得分:-2)

你可以

insert into tablename (name, `order`) 
values( 'name', select `order`+1 from tablename where name='name')

您也可以在内部选择中使用id = id_val。

希望这就是你所追求的,这个问题并不完全清楚。