我将以下查询与MySQL 5.5(或早期版本)一起使用了多年,没有任何问题:
SELECT t2.Code from (select Country.Code from Country order by Country.Code desc ) AS t2;
结果的顺序总是按照我的需要降序。
上周,我刚刚迁移到新的MySQL版本(实际上,我迁移到了MariaDB
10.0.14),现在具有相同数据库的相同查询不再按降序排序。它以升序排序(或使用自然顺序排序,实际上不确定)。
因此,有人可以告诉我这是一个错误还是这是最新版本的MySQL / MariaDB中行为的改变?
经过一点挖掘,我可以确认您的两种情况:
MySQL 5.1确实ORDER BY
在子查询中应用了内部。
如果未提供,则Linux上的MariaDB 5.5.39 不会 应用ORDER BY
内部子查询LIMIT
。但是,当给出相应的命令时,它 会
正确应用订单LIMIT
:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
如果没有LIMIT
,没有一个很好的理由来应用子查询中的排序。它可以等效地应用于外部查询。
事实证明,MariaDB已记录了此行为,并且不将其视为错误:
FROM
根据SQL标准,“表”(子句中也包含子查询)是无序的行集。表(或FROM
子句中的子查询)中的行不按任何特定顺序排列。这就是为什么优化器可以忽略ORDER BY
您指定的子句的原因。实际上,SQL标准甚至不允许ORDER BY
子句出现在该子查询中(我们允许它,因为ORDER BY ... LIMIT
…更改了结果,行的集合,而不仅仅是行的顺序)。您需要将
FROM
子句中的子查询视为一组未指定且未定义的行,并将其ORDER BY
放在顶层SELECT
。
因此,MariaDB还建议ORDER BY
在最外面的查询中应用,或LIMIT
在必要时应用。
注意:我目前无法访问适当的MySQL
5.5或5.6,以确认那里的行为是否相同(并且SQLFiddle.com出现故障)。对原始错误报告的评论(以非错误关闭)表明MySQL
5.6的行为方式可能与MariaDB相同。
问题内容: 这就是整个查询… 如果… 和… 有明显的理由吗? 正在服用? 扩展说明 问题答案: 您可以始终使用EXPLAIN或EXPLAIN EXTENDED 来查看MySql对查询所做的操作 您也可以用稍微不同的方式编写查询,是否尝试过以下方法? 看看效果如何会很有趣。我希望它会更快,因为目前,我认为MySql将为您拥有的每个节目运行内部查询1(这样一个查询将运行多次。联接应该更有效。) 如果希
前面我们介绍了如何使用 SELECT、INSERT、UPDATE 和 DELETE 语句对 MySQL 进行简单访问和操作。下面在此基础上开始学习子查询。 子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。 子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在
当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?
问题内容: 我有一名学生(身份证,姓名,部门,年龄,分数)。我想找到每个系中得分最高(年龄最小的学生)的最小的学生。在SQL Server中,我可以使用以下SQL。 但是,在Oracle中,不能在子查询中使用order by子句,并且没有limit / top like关键字。我必须将学生表与自身连接两次以查询结果。在oracle中,我使用以下SQL。 有没有人有任何想法可以简化上述用于oracl
问题内容: 我的数据库中有一个页面表,每个页面可以有一个父项,如下所示: 如果选择一个以上级别,那么最好的MySQL查询是最好的选择父级,子级,子级顺序的所有页面的查询,最多三个级别。上面的示例将产生所需的顺序: 问题答案: 我认为您应该在表中再添加一个字段,称为level并将其存储在节点的level中,然后按级别然后按父级对查询进行排序。
问题内容: 如标题所述,我想要一个解决方法… 干杯 问题答案: 您可能会希望将an添加到嵌套查询中。