当前位置:首页 > MySQL

解决MySQL子查询排序失效的问题

canca6年前 (2020-09-28)MySQL1232

问题描述:高版本的MySQL(5.6以上)在子查询中使用order by 语句后查询结果并不会显示排序后的结果。
以下是我使用的两个解决方法,供参考:
1.当子查询的order by语句后面没有limit关键字时,数据库会自动优化,即忽略order by语句。因此只需要添加limit关键字即可。
2.在子查询中使用聚合函数。


具体示例如下所示: 现在我有一张表message,存放用户的对话信息,表中内容如下所示(图中我的一些测试数据请忽略:))

message表

现在我想查询按照conversation_id分组后,每组的created_date值最大的数据项所组成的所有数据结果。查询结果的实际意义就是每组对话中最新的一条对话信息。预期查询结果应该显示id为2和10所在的两条数据。

先直接在子查询中使用order by语句,查询语句为:
select * from (select * from message order by created_date desc) b group by conversation_id;
查询结果为:

查询结果

可以发现查询的结果与预期刚好相反,数据库默认查询每组created_date值最小的那一个,即最老的一个对话信息。

**1.**使用方法1解决:
查询语句:
select * from (select * from message order by created_date desc limit 9999) b group by conversation_id;
子查询中增加了限制查询9999条的语句,这样数据库就不会自动优化order by语句,但是要保证限制的数据要大于操作的数据的总数量。
查询结果:

此时查询结果与预期相同。

**2.**使用方法2解决:
select * from message ,
( select max(created_date) as date from message group by conversation_id) b
where b.date = message.created_date order by created_date desc;
在子查询中先使用聚合函数max找到每组created_date的最大值,然后通过where后的语句获取message中max(created_date)所在的数据项,最后再通过时间由大到小倒序排序即可。

查询结果:(下图截错了,仅展示的是没有对查询结果进行倒序排序的结果)
查询结果

花了一下午回顾了一下数据库书,想到了第二个方法,同时也发现好多新大陆。充分说明之前学的太不扎实了,靠死记了一些,不用了之后就基本全忘了。还是自己动手能力差了些,不会学以致用。现在在努力。

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/729.html

标签: MySQL
分享给朋友:

“解决MySQL子查询排序失效的问题” 的相关文章

mysql 外鍵約束

1. 什么是参照完整性?——————–参照完整性(完整性约束)是数据库设计中的一个重要概念,当数据库中的一个表与一个或多个表进行关联时都会涉及到参照完整性。比如下面这个例子:文章分类表 -  categoriescategory_id ...…

解决PHP存取MySQL 4.1乱码问题

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的M...…

MySQL性能优化的最佳20+条经验

MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤...…

Xtrabackup安装及使用

简介:  Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。    Xtrabackup有两个主要的工具:xtrabackup、innobacku…

MySQL表索引损坏致Crash及修复过程实例

监控到一台MySQL实例在早上发生过Crash,上去看了一下,已经被mysqld_safe成功拉起。上去检查一下错误日志,发现错误日志如下(已对表名,库名,路径做脱敏处理):…

Mysql分页查询丢失数据

问题场景描述将一个sql的查询结果集导出为文件,由于一次查询结果集可能上百万条,在开发环境和测试环境均造成了内存溢出的问题。因此改为分页查询数据的方式,虽然慢点,但是规避了内存溢出的问题。但是,在这一百多万条导出的数据中,发现导出的文件中的数据与数据库直接查询出的数据不一致。偶发性的部分数据缺失,部…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。