【问题标题】:MySQL select from subquery orderMySQL 从子查询顺序中选择
【发布时间】: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 感谢您的回答,但这可以通过文档或其他任何方式确认吗?这对我来说似乎也很明显,但对我的回答的评论让我很感兴趣:stackoverflow.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,它会被优化掉,因为它无论如何都没有效果。”我在这里没有看到有问题的查询的这样的声明,但我不明白为什么它不能这样做。

标签: mysql select subquery


【解决方案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 问题,如下面的答案:stackoverflow.com/questions/7745609/… 和因此的问题
  • @yura 在该线程接受的答案下提供的任何建议都不依赖于这种“技术”
  • @Strawberry 是的,这就是我添加该答案的原因:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多