2011-04-19 141 views
2

如何更改行的顺序以使行按custom_field排序?MySQL - 如何更改表中行的顺序

例如,我得到了表与ID为ASC,并希望有desc顺序的行。我需要它以便不使用mysql查询中的'order by id desc'来优化查询速度。

我想:

insert table_with_ordered_rows() 
select * from table_with_not_ordered_rows order by id desc; 

,但它只是复制标准递增顺序表。

回答

3

在mysql中获取排序结果集的唯一方法是在查询中添加ORDER BY

在mysql查询中优化查询速度。

这是不正确的。如果您在查询性能方面存在问题 - 请询问查询性能。给我们完整的表格结构,查询,数据解释和统计。

+0

表格非常简单,但该表格中有大约100万行,所以'order by'会大大减慢查询速度。 – Newbie1 2011-04-19 00:58:11

+0

@ Newbie1:正如我所说 - 如果你想解决你的任务 - 你需要询问有关查询问题的正确问题。 – zerkms 2011-04-19 01:24:57

1
ALTER `tablename` ORDER BY `orderField` DESC; 

但是,您必须在每次插入后执行此查询。见13.1.7. ALTER TABLE Syntax

+0

这将工作,直到再添加一行。另外 - 如果你使用任何'WHERE'子句,mysql不需要按这个顺序返回数据。 – zerkms 2011-04-19 00:51:01

1

确保结果集中订单的唯一方法是使用ORDER BY子句。一个ORDER BY可以使用索引,如果存在的话......

这就是说,以下为我工作在MySQL上49年5月1日:

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 
+0

它的工作原理!谢谢!你说“保证结果集中的顺序的唯一方法是使用ORDER BY子句”,但是ORDER BY减缓了查询速度,即使存在不错的优化和索引时也是如此,所以通过插入的默认顺序可以修复它或者你有更好的主意吗? – Newbie1 2011-04-19 01:56:50

+0

但是,这不是我想要实现的目标,因为我希望将id分配给旧表中的行,并且只更改行的顺序(如插入顺序)。 – Newbie1 2011-04-19 02:12:39