MySQL 8.0与5.6 Group By 取同组第一条记录差异及解决
版权申诉
188 浏览量
更新于2024-09-10
收藏 649KB PDF 举报
"MySQL group by取同组第一条"
在MySQL中,`GROUP BY`语句用于对数据进行分组,通常与聚合函数(如COUNT(), SUM(), AVG()等)一起使用,以便对每个分组进行计算。然而,在某些情况下,用户可能希望在每个分组内获取特定的行,例如第一条或最后一条。在MySQL 5.6及更低版本中,用户可以通过`GROUP BY`配合未指定的其他列来获取同组的第一条记录,但这个行为在MySQL 5.7和更高版本中发生了变化。
在MySQL 5.6中,以下SQL语句可能会返回每个`MemberID`分组的第一条记录,即使没有明确的`ORDER BY`子句:
```sql
SELECT SwipeID, MemberID, AddTime
FROM (
SELECT * FROM front_membercardswipe fmcs
) a
GROUP BY a.MemberID
```
然而,自MySQL 5.7开始,引入了更严格的`ONLY FULL GROUP BY`模式,这意味着在`GROUP BY`子句中提到的所有列都必须出现在聚合函数中或被包含在分组表达式内。因此,上述查询在MySQL 8.0中不再有效,因为它没有明确指出如何选择每个分组内的行。
在MySQL 8.0中,如果你想要获取每个`MemberID`分组的第一条记录,你需要显式地指定排序和限制,如下所示:
```sql
SELECT SwipeID, MemberID, AddTime
FROM (
SELECT * FROM front_membercardswipe fmcs
ORDER BY AddTime ASC -- 或者 DESC 如果你想取最新的记录
LIMIT 1
) a
GROUP BY a.MemberID
```
这种方式确保了在每个分组内部先按照`AddTime`排序,然后使用`LIMIT`获取每个分组的第一行。
此外,还可以考虑修改查询策略,避免使用子查询和`LIMIT`,根据实际业务需求调整SQL语句。例如,如果`SwipeID`是每个分组的唯一标识,可以使用`MIN()`或`MAX()`函数结合`ORDER BY`来获取所需记录:
```sql
SELECT MIN(SwipeID) as SwipeID, MemberID, AddTime
FROM front_membercardswipe fmcs
GROUP BY MemberID
ORDER BY AddTime ASC -- 或者 DESC
```
这样,你可以根据`AddTime`获取每个`MemberID`的最早或最晚记录,而无需依赖于MySQL版本的行为。
对于不同版本的MySQL,理解和遵循其对`GROUP BY`语句的解释是至关重要的,尤其是在进行SQL优化时。建议始终参考最新的官方文档以确保代码的兼容性和最佳性能。同时,理解业务逻辑并根据实际情况调整SQL语句也是非常必要的。
2020-09-11 上传
2020-12-14 上传
2014-04-17 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38714910
- 粉丝: 4
- 资源: 921
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录