MySQL 从子查询顺序中选择

Posted

技术标签:

【中文标题】MySQL 从子查询顺序中选择【英文标题】:MySQL select from subquery order 【发布时间】:2014-12-05 18:26:21 【问题描述】:

如果我有下表:

CREATE TABLE `docs` ( 
    `id` int(6) unsigned NOT NULL, 
    `rev` int(3) unsigned NOT NULL, 
    `content` varchar(200) NOT NULL, 
--
    PRIMARY KEY (`id`) 
) 

并执行以下查询:

select * 
from ( 
    select * 
    from docs 
    order by rev desc 
) as `rows`

返回行的顺序会和内部查询的顺序一样吗?​​

一般来说,这可以保证吗?

【问题讨论】:

是的,顺序是一样的 @juergend 感谢您的回答,但这可以通过文档或其他方式确认吗?这对我来说似乎也很明显,但对我的回答的评论让我很感兴趣:***.com/questions/7745609/… :) 我确信 int 3 和 int 6 不会像您认为的那样做!而且我不确定@juergen 是对的……但话又说回来,他通常是! 对于任何回答这个问题的人,请记住,UNION 中的内部 ORDER BY 可能会被优化掉!是的,我知道这是不同的,但仍然如此。此外,我认为 OP 要求“按照 SQL 规范”提供保证。我怀疑是否有这样的保证。 dev.mysql.com/doc/refman/5.0/en/union.html 说“如果 ORDER BY 出现在 SELECT 中没有 LIMIT,它会被优化掉,因为它无论如何都没有效果。”我在这里没有看到有问题的查询的这样的声明,但我不明白为什么它不能这样做。 【参考方案1】:

是的,如果你只使用

select * 
from ( 
    select * 
    from docs 
    order by rev desc 
) as `rows`

那么它将和往常一样但是不应该在子查询中使用 ORDER BY。 在某些外部查询中使用了子查询,并且该外部查询无论如何都必须进行排序,因此没有必要对子查询进行排序

如果在子查询中使用 TOP 或 LIMIT,则需要在子查询中使用 ORDER。但这不是标准 SQL

你应该这样使用它

SELECT * 
FROM ( 
    SELECT * 
    FROM docs 
) AS `rows` ORDER BY rev DESC;

【讨论】:

之所以应该这样做是为了解决select rows with max-value 问题,如下面的答案:***.com/questions/7745609/… 和因此的问题 @yura 在该线程接受的答案下提供的任何建议都不依赖于这种“技术” @Strawberry 是的,这就是我添加该答案的原因:)

以上是关于MySQL 从子查询顺序中选择的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从子查询顺序中选择

MySQL 从子查询顺序中选择

从子查询 SQL 中选择最大数据,但它显示来自子查询的所有结果

从子查询mysql中选择数据

MYSQL 选择子查询如果存在

如何从子查询中返回两个字段