深圳网站设..,怎么免费自己做网站,怎么查寻一个网站做的竞价,电脑培训速成班多少钱文章目录 一、场景#xff1a;二、解决办法1、使用 having 来阻止合并2、足够大的limit3、子查询 一、场景#xff1a; 问题描述#xff1a;Mysql5.7版本中#xff0c;查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法。 应用场景#xff1a;一对多的关系… 文章目录 一、场景二、解决办法1、使用 having 来阻止合并2、足够大的limit3、子查询 一、场景 问题描述Mysql5.7版本中查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法。 应用场景一对多的关系通常需要取最新、最近的一条数据时。
举例比如客户表订单表一个客户可能有很多订单一对多的关系我们想查询每个客户最新的一单数据
客户id姓名1001客户张三1002客户李四
订单id客户id下单时间110012023-11-10 15:20:00210012023-11-11 15:10:00310022023-09-11 12:20:00410032023-10-11 14:20:00510032023-12-11 20:20:00610032023-12-21 14:20:00
常规操作尝试使用子查询先排序再分组取最新一条
SELECT * FROM ( SELECT * FROM order_info ORDER BY created_time desc ) AS t GROUP BY customer_id 但是这个方式在低版本中有效 在 5.7 版本中引入新特性 derived_merge 优化过后group by子句中使用order by导致order by失效所以你发现取到的不是最新的
二、解决办法
1、使用 having 来阻止合并
SELECT * FROM ( SELECT * FROM order_info HAVING 11 ORDER BY created_time desc ) AS t GROUP BY customer_id 2、足够大的limit
用一个超级大的limit放在order by后面
SELECT * FROM ( SELECT * FROM order_info ORDER BY created_time desc LIMIT 1000000 ) AS t GROUP BY customer_id 3、子查询
一些场景如果是有序递增的可以通过取Max(id)方式,实现效果
SELECT * FROM order_info where order_id in ( SELECT MAX( order_id ) FROM order_info GROUP BY customer_id )取到最新的数据在关联客户表查询即可。 上边提到了取最新、最近数据的可试方法那还有一种常见场景是删除重复的记录(只保留一条)怎么处理呢SQL删除重复的记录(只保留一条)-窗口函数row_number()