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 - 如何更改表中的行顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 获取 MySQL 表中的行数?

如何使用填充旧表中的行的动态数据动态更新新MySQL表中的行?

如何计算 MySQL 表中的行数(PHP PDO)

MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?

如何更改 MySQL 中的自动增量计数器?

如何更改生成表中的列顺序(grails 约束不适用于 mongodb 插件)