我有这个问题。
SELECT * FROM (SELECT * FROM private_messages ORDER BY id DESC) a
“DESC”在我的本地服务器上运行,但在其他服务器上不起作用。 但是,如果我只是这样写:
SELECT * FROM private_messages ORDER BY id DESC
它适用于两台服务器。会导致这种情况的原因是什么?
答案 0 :(得分:0)
这对评论来说太长了。
这不是一个错误。它记录了here:
从MySQL 5.7.6开始,优化器处理ORDER BY的传播 派生表中的子句或对外部查询块的视图引用 如果满足以下条件,则通过传播ORDER BY子句: 外部查询未分组或聚合;没有说明 DISTINCT,HAVING或ORDER BY;并具有此派生表或视图 引用作为FROM子句中的唯一源。否则, 优化器忽略ORDER BY子句。在MySQL 5.7.6之前, 优化器总是传播ORDER BY,即使它是无关紧要的 导致查询无效。
然而,您的查询并非如此。所以,我猜你的第二台服务器正在运行MariaDB,它接近在没有ORDER BY
LIMIT
。
A" table" (以及FROM子句中的子查询)是 - 根据 SQL标准 - 一组无序行。表中的行(或表中的行) FROM子句中的子查询)没有任何特定的顺序。那' S 为什么优化器可以忽略您拥有的ORDER BY子句 指定。实际上,SQL标准甚至不允许ORDER BY 要出现在此子查询中的子句(我们允许它,因为ORDER BY ... LIMIT ...更改结果,行集,而不仅仅是它们的顺序。)
您需要将FROM子句中的子查询视为一组行 一些未指定和未定义的顺序,并将ORDER BY放在 顶级SELECT。
Why is ORDER BY in a FROM Subquery Ignored?
最好的办法就是将ORDER BY
子句移动到外部查询。或者根本不使用子查询。