mysql - MySQL“GROUP BY”忽略记录顺序

原文 标签 mysql sql-order-by

我们刚刚将数据库从MySQL 5.0服务器迁移到5.5服务器,并且像这样的简单查询似乎不再能正常工作:

    SELECT * FROM (
        SELECT *
        FROM tblTable
        ORDER BY fldField ASC
    ) tmp
    GROUP BY fldField


内部查询仍然返回正确排序的记录集,但是group by不再选择该集合的第一条记录。

将顺序切换为DESC也不起作用,因此大概group by尚未切换为选择最后一条记录。

据我所知,group by实际上只是按照创建顺序选择第一条记录,而不是实际记录集的顺序。那有道理吗?

我似乎找不到任何错误报告或变更日志记录,因此希望这里的人有想法吗?

最佳答案

事实证明,CentOS 7附带了MariaDB而不是MySQL,MariaDB忽略了内部查询的ORDER BY子句,而将外部查询作为无序表来处理内部的结果集,以提高性能。

这里有两个选择。要么:


根据许多此类文章之一,添加MySQL Community Edition覆盖层并从中覆盖MySQL,而不是从CentOS存储库中进行安装:https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-centos-7
或修改具有ORDER BY子句的内部查询也具有LIMIT子句,这会使MariaDB将结果集视为有序表。例如。

SELECT * FROM (
    SELECT *
    FROM tblTable
    ORDER BY fldField ASC
    LIMIT 10000000
) tmp
GROUP BY fldField



希望这可以节省其他人的时间。

相关文章:

java - MYSQL插入查询未将数据更新到JAVA中的表

php - Yii2:Gridview中一列关于过滤值的总和

mysql - 如何从此字符串/ laravel获取时间戳

php - 通过mysql表排序并按数量排序

php - 如何从MySQL表中获取多对多关系数据,并用php显示?

mysql - 如何获得值保持超过限制的时间

mysql - 一个查询中的MAX()和SUM()

mysql - 在第二个表中按日期排序结果

mysql - 如何在MySQL查询中使用ORDER BY时忽略特殊字符

mysql - 当按顺序排序的列是case语句时,如何通过BigInteger而不是varchar使MySQL排序值?