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数据备份与还原教程下篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MySQL8.0移除传统的.frm文件原因及解读

    MySQL8.0移除传统的.frm文件原因及解读

    MySQL 8.0移除传统的.frm文件,采用基于InnoDB的事务型数据字典,主要解决了元数据不一致、性能优化、架构简化、增强功能支持、兼容性与升级问题,这一变革提高了数据库的可靠性和性能,为未来的高级功能奠定了基础
    2025-03-03
  • mysql实现合并同一ID对应多条数据的方法

    mysql实现合并同一ID对应多条数据的方法

    这篇文章主要介绍了mysql实现合并同一ID对应多条数据的方法,涉及mysql GROUP_CONCAT函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 一步步教你如何使用mysql binlog恢复数据

    一步步教你如何使用mysql binlog恢复数据

    Binlog日志即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,下面这篇文章主要给大家介绍了关于如何使用mysql binlog 恢复数据的相关资料,需要的朋友可以参考下
    2023-04-04
  • mysql实现将字符串转化成int类型

    mysql实现将字符串转化成int类型

    这篇文章主要介绍了mysql实现将字符串转化成int类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MySQL查询性能优化方法汇总讲解

    MySQL查询性能优化方法汇总讲解

    这篇文章主要介绍了MySQL查询性能优化方法,Mysql查询性能优化要从三个方面考虑,库表结构优化、索引优化和查询优化,通常在实际应用中,我们要面对这三种搅和一起的情况,需要了解MySQL查询性能优化方法的朋友可以参考下
    2024-05-05
  • 解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)

    解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)

    有次同事提出开发使用的mysql数据库连接很慢,因为我们的mysql开发数据库是单独一台机器部署的,所以认为可能是网络连接问题导致的。
    2011-07-07
  • mysql主从复制读写分离的配置方法详解

    mysql主从复制读写分离的配置方法详解

    一般来说mysql都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
    2018-04-04
  • Windows下mysql 8.0.11 安装教程

    Windows下mysql 8.0.11 安装教程

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.11安装教程 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Mysql分片,大数据量时扩容解决方案

    Mysql分片,大数据量时扩容解决方案

    这篇文章主要介绍了Mysql分片,大数据量时扩容解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论