我的测试服务器版本如下:
MySQL Server 5.7.20
MariaDB Server 10.1.9
我在两个数据库中做了相同的表。
CREATE TABLE `sort_test` (
`ind` int(11) NOT NULL AUTO_INCREMENT,
`time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ind`)
) ENGINE=InnoDB;
我在两张表中插入了九条记录
insert sort_test(time) values(now());
insert sort_test(time) values(now());
insert sort_test(time) values(now());
...
insert sort_test(time) values(now());
当我执行死刑的时候 SELECT * FROM sort_test order by time desc;
,结果是相等的。
+-----+---------------------+
| ind | time |
+-----+---------------------+
| 9 | 2018-01-05 23:43:59 |
| 8 | 2018-01-05 23:43:58 |
| 7 | 2018-01-05 23:43:57 |
| 6 | 2018-01-05 23:43:56 |
| 5 | 2018-01-05 23:43:55 |
| 4 | 2018-01-05 23:43:54 |
| 3 | 2018-01-05 23:43:53 |
| 2 | 2018-01-05 23:43:52 |
| 1 | 2018-01-05 23:43:51 |
+-----+---------------------+
9 rows in set (0.01 sec)
顺便说一下,我执行死刑的时候 select * from (SELECT * FROM sort_test order by time desc) as A;
,结果不同。
mariadb> select * from (SELECT * FROM sort_test order by time desc) as A;
+-----+---------------------+
| ind | time |
+-----+---------------------+
| 1 | 2018-01-05 23:43:51 |
| 2 | 2018-01-05 23:43:52 |
| 3 | 2018-01-05 23:43:53 |
| 4 | 2018-01-05 23:43:54 |
| 5 | 2018-01-05 23:43:55 |
| 6 | 2018-01-05 23:43:56 |
| 7 | 2018-01-05 23:43:57 |
| 8 | 2018-01-05 23:43:58 |
| 9 | 2018-01-05 23:43:59 |
+-----+---------------------+
9 rows in set (0.02 sec)
与
mysql> select * from (SELECT * FROM `sort_test` order by time desc) as A;
+-----+---------------------+
| ind | time |
+-----+---------------------+
| 9 | 2018-01-05 23:43:59 |
| 8 | 2018-01-05 23:43:58 |
| 7 | 2018-01-05 23:43:57 |
| 6 | 2018-01-05 23:43:56 |
| 5 | 2018-01-05 23:43:55 |
| 4 | 2018-01-05 23:43:54 |
| 3 | 2018-01-05 23:43:53 |
| 2 | 2018-01-05 23:43:52 |
| 1 | 2018-01-05 23:43:51 |
+-----+---------------------+
9 rows in set (0.10 sec)`
结果按不同的顺序排序。
为什么?发生什么事了?
1条答案
按热度按时间nfs0ujit1#
没有一个
ORDER BY
,则不保证结果的顺序。你没有ORDER BY
在外面SELECT
. 子查询传递无序的集合或行。也就是说,优化器可以随意忽略ORDER BY
在子查询中。优化器是否采取这种自由取决于您正在查看哪个版本的mysql分支。也许这也取决于月亮的相位。
你怎么能做出同样的结果呢?嗯,为什么?
SELECT * FROM ( subquery );
是不必要的--只需运行子查询。好吧,也许你正在做一些你简化了查询的事情??如果是这样的话,把它放回去,这样我们就可以讨论了。几年前,当“groupwise max”代码在某些版本上无法工作时,我就被这个问题烧死了。
好吧,在不久的将来,有一个乱七八糟的方法可以做你想做的事情:添加一个
LIMIT
带大数的子查询。乱七八糟!我同意马克的观点——你的期望是错误的。