MySQL - 如何更改表中的行顺序
Posted
技术标签:
【中文标题】MySQL - 如何更改表中的行顺序【英文标题】:MySQL - How to change the order of rows in the table 【发布时间】:2011-04-19 00:46:46 【问题描述】:如何更改行的顺序以使行按 custom_field 排序?
例如,我有一个 id 为 asc 的表,并希望将行按 desc 顺序排列。我需要它是为了不在mysql查询中使用'order by id desc'来优化查询速度。
我试过了:
insert table_with_ordered_rows()
select * from table_with_not_ordered_rows order by id desc;
但它只是按照标准 asc 顺序复制表。
【问题讨论】:
【参考方案1】:在mysql中获取排序结果集的唯一方法是在查询中添加ORDER BY
。
在mysql查询中优化查询速度。
这是不正确的。如果您对查询性能有疑问 - 然后询问查询性能。给我们完整的表结构、查询、解释和数据统计。
【讨论】:
表非常简单,但该表中大约有数百万行,因此“order by”会大大降低查询速度。 @Newbie1:正如我所说 - 如果你想解决你的任务 - 你需要就查询问题提出适当的问题。【参考方案2】:保证结果集中顺序的唯一方法是使用ORDER BY
子句。 ORDER BY
可以使用索引,如果存在的话...
也就是说,以下在 MySQL 5.1.49 上对我有用:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$
INSERT INTO t1 (col) VALUES ('a'),('b'),('c');
结果集:
id col
--------
1 a
2 b
3 c
中间表:
CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col` varchar(45) DEFAULT NULL,
`old_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$
INSERT INTO t2 (col, old_id)
SELECT t.col, t.id
FROM t1 t
ORDER BY t.id DESC
结果集:
id col old_id
----------------
1 c 3
2 b 2
3 a 1
【讨论】:
有效!谢谢!您说“保证结果集中顺序的唯一方法是使用 ORDER BY 子句”,但 ORDER BY 会减慢查询速度,即使有不错的优化和索引,所以插入的默认顺序可以解决它或者你有更好的主意吗? 但这并不是我真正想要实现的目标,因为我希望将 id 分配给旧表中的行,并且只需更改行的顺序(如插入顺序)。 【参考方案3】:ALTER `tablename` ORDER BY `orderField` DESC;
但您必须在每次插入后执行此查询。见13.1.7. ALTER TABLE
Syntax。
【讨论】:
这将一直有效,直到再添加一行。另外 - 如果您使用任何WHERE
子句,mysql 不需要按此顺序返回数据。以上是关于MySQL - 如何更改表中的行顺序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用填充旧表中的行的动态数据动态更新新MySQL表中的行?