mysql order by 失效_mysql中group by之后order by无效

当在MySQL中使用GROUP BY聚合后,直接使用ORDER BY原始字段可能无法得到预期排序。例如,查询回复表replies,通过GROUP BY tid获取每个主题的最新回复时间,如果直接ORDER BY inputtime可能不会按最新时间降序排列。原因是ORDER BY在GROUP BY后处理,它针对的是聚合后的结果集,而不是原始记录。因此,应当使用聚合函数如MAX(inputtime)并据此排序,如ORDER BY MAX(inputtime) DESC。
摘要由CSDN通过智能技术生成

创建一张表(比如说帖子回复表,简单的几个字段)

create table replies(

id int unsigned primary key auto_increment,

uid int unsigned not null default 0,

tid int unsigned not null default 0,

content varchar(1000) not null default '',

inputtime int unsigned not null default 0,

updatetime int unsigned not null default 0

)engine myisam charset utf8;

插入数据

insert into replies

values

(null,3,4,'第四篇帖子的回复内容',1459848612,1459848612),

(null,4,1,'第一篇帖子的回复内容',1459858612,1459858612),

(null,3,3,'第三篇帖子的回复内容',1459868612,1459868612),

(null,5,1,'第一篇帖子的回复内容',1459878612,1459878612),

(null,1,5,'第五篇帖子的回复内容',1459888612,1459888612),

(null,2,5,'第五篇帖子的回复内容',1459898612,1459898612),

(null,8,2,'第二篇帖子的回复内容',1459908612,1459908612);

这样排序自然没什么问题

select tid,max(inputtime) as aa from replies group by tid order by aa desc;

然而

select tid,max(inputtime) from replies group by tid order by inputtime desc;

这样排序的话,结果却是这样

732293ae86e36d1e558eb64e57e1353b.png

附个人理解:

这个max(inputtime)虽然和表上的数据是一样的,但它并不代表某个tid的inputtime,order by inputtime 实际是对表中的inputtime排序,所以这里看不到效果,但感觉这个理由有点牵强,请赐教,在这里谢谢诸位了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用group by和order by来筛选排序时,可能会出现order by失效的情况。这通常是因为排序字段没有索引或者排序字段存在重复值导致的。为了解决排序分页数据重复的问题,有两种方式可以尝试。第一种是在排序字段加上唯一值,比如主键id,这样可以确保参与排序的键值不相同。第二种是避免使用堆排序,而是让order by根据索引来排序。换句话说,order by后面的字段应该有索引。在使用JPA分页查询时,如果order by的字段没有索引,JPA不会自动添加索引或id字段,这一点需要注意。总的来说,排序的实现离不开算法,在关系型数据库存在多种排序算法。MySQL在排序过程会根据情况使用不同的排序算法,如快速排序、归并排序和堆排序。如果order by不能使用索引进行排序,MySQL会使用排序算法进行排序。如果排序内容可以全部放入内存,则仅在内存使用快速排序。如果排序内容无法全部放入内存,则会将排好序的内容分批次放入文件,并进行归并排序。如果排序包含limit语句,则会使用堆排序进行优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MYSQL数据库联合使用GROUP BY和ORDER BY后ORDER BY排序失效的问题](https://blog.csdn.net/zhuzhonghua02/article/details/116235505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [union和子查询order by一起使用导致排序失效问题](https://blog.csdn.net/songzehao/article/details/120444636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值