MySQL中group by与max()一起使用的坑

 更新时间:2023年08月09日 15:09:14   作者:搬砖,攒路费  
最近在做一个项目,发现用之前SQL语句导出的余额与客户人员最近消费记录所显示的余额不一致,本文就来了解一下这个错误,感兴趣的可以了解一下

前言

国庆之间在进行一个消费项目切换时,发现用之前SQL语句导出的余额与客户人员最近消费记录所显示的余额不一致,客户人员又比较多,还好及时发现没凉成大错!现在来记录一下。

一 GROUP BY的简单介绍

GROUP BY顾名思义,group: 分组,by: 以…; 组合起中来就是以什么来分组。在mysql理解为以一个字段或多个字段来分组显示结果集,如下。

数据表

执行以下语句

select *from scgroup by sid

结果如下

结果以sid分组表示出来了,细心一点会发现分组后显示的记录是分组前第一条sid对应的值,执行以下语句可以观察到,如下。

SELECT *,GROUP_CONCAT(score)
FROM sc
GROUP BY sid;

二 MAX()的简单介绍

MAX()是mysql里面的一个聚合函数,用来取最大值的,如下。

SELECT MAX(score)
FROM sc;

结果显示score列的最大值,是没有问题的。

三 group by与max()一起使用

要求:导出sid中score值最大的那条记录(类似与导余额)

之前导余额用的语句类似以下SQL语句

SELECT sid,cid,MAX(score) as score
FROM sc
GROUP BY sid;

咋一看,score的值筛选出来是最大的,没有问题,但是核对score最高值对应的记录时发现是错的,如下

四 原因

我分析了下原因,主要是由group by 分组后显示的是第一条记录,而max()取的是相同sid中的最大score值造成的,如下

SELECT sid,cid,score,GROUP_CONCAT(score)
FROM sc
GROUP BY sid;

相当于把第一条记录的score值用最大值替换了,这显然是不对的。

五 解决办法

我的方法是先用子查询把sid和其最大值score先查出来,然后再和原表匹配,如下

SELECT a.sid,a.cid,a.score
FROM
sc as a,
(SELECT sid,max(score) as score
FROM sc
GROUP BY sid) as b
WHERE a.sid=b.sid AND a.score=b.score

当然,解决方法不止这一种,具体情况具体讨论。

到此这篇关于MySQL中group by与max()一起使用的坑的文章就介绍到这了,更多相关MySQL group by与max()一起使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一次mysql迁移的方案与踩坑实战记录

    一次mysql迁移的方案与踩坑实战记录

    这篇文章主要给大家介绍了一次mysql迁移的方案与踩坑的相关资料,MySQL迁移是DBA日常维护中的一个工作,迁移究其本义,无非是把实际存在的物体挪走,保证该物体的完整性以及延续性,需要的朋友可以参考下
    2021-08-08
  • MySQL的左连接、右连接、内连接用法解读

    MySQL的左连接、右连接、内连接用法解读

    这篇文章主要介绍了MySQL的左连接、右连接、内连接用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • MySQL学习之InnoDB结构探秘

    MySQL学习之InnoDB结构探秘

    这篇文章主要是对InnoDB结构的探秘,InnoDB是基于磁盘存储,其存储的最基本单元是页,大小为16KB。而CPU和磁盘之间速度相差悬殊,所以通常使用内存中的缓冲池来提高性能,感兴趣的同学可以参考阅读
    2023-03-03
  • mysql 5.7.21 解压版安装配置图文教程

    mysql 5.7.21 解压版安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.21 解压版安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 解决mysql报错:Data source rejected establishment of connection, message from server: \"Too many connectio

    解决mysql报错:Data source rejected establishment of connect

    这篇文章主要给大家介绍了关于如何解决mysql报错:Data source rejected establishment of connection, message from server: \"Too many connectio的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • mysql too many open connections问题解决方法

    mysql too many open connections问题解决方法

    这篇文章主要介绍了mysql too many open connections问题解决方法,其实是max_connections配置问题导致,它必须在[mysqld]下面才会生效,需要的朋友可以参考下
    2014-05-05
  • MySQL中的binlog相关命令和恢复技巧

    MySQL中的binlog相关命令和恢复技巧

    这篇文章主要介绍了MySQL中的binlog相关命令和恢复技巧,需要的朋友可以参考下
    2014-05-05
  • MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

    MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

    这篇文章主要介绍了MySQL 5.6 (Win7 64位)下载、安装与配置图文教程的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 详解MySQL插入和查询数据的相关命令及语句使用

    详解MySQL插入和查询数据的相关命令及语句使用

    这篇文章主要介绍了MySQL插入和查询数据的相关命令及语句使用,包括相关的PHP脚本操作方法讲解也很详细,需要的朋友可以参考下
    2015-11-11
  • MySQL中的多表查询与事务操作

    MySQL中的多表查询与事务操作

    这篇文章主要介绍了MySQL中的多表查询与事务操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论