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 从子查询顺序中选择的主要内容,如果未能解决你的问题,请参考以下文章