我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL查询:Group By 后取出每一组中最大的数据

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码


	MySQL查询:Group By 后取出每一组中最大的数据


	MySQL查询:Group By 后取出每一组中最大的数据
[数据库教程]

环境:MySQL5.7版本

先生成一组测试数据

public static int randAge(){
    return new Random().nextInt(100);
}
public static char randScore(){
    int i = new Random().nextInt(4) + 65;
    return (char)i;
}
public static String randName(){
    StringBuilder s = new StringBuilder();
    for (int i = 0; i < 3; i++){
        s.append((char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0x4e00 + 1))));
    }
    return s.toString();
}
public static void main(String[] args) {
    for(int i = 1; i <= 20; i++){
        System.out.println("INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES ("+ i +", ‘"+ randName() +"‘, "+ randAge() +", ‘"+  randScore() +"‘);");
    }
}

比如:

INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (1, ‘襠醞奪‘, 70, ‘C‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (2, ‘穟玔檠‘, 77, ‘C‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (3, ‘繜翿宽‘, 11, ‘A‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (4, ‘敕搢謝‘, 55, ‘A‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (5, ‘薰舒翎‘, 86, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (6, ‘贿怆軻‘, 31, ‘B‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (7, ‘踰齁陈‘, 26, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (8, ‘溧况癈‘, 94, ‘B‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (9, ‘捳縇睢‘, 38, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (10, ‘漲堔杙‘, 0, ‘C‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (11, ‘輪塶讣‘, 13, ‘B‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (12, ‘刪庝熽‘, 53, ‘B‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (13, ‘鄀乹聐‘, 90, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (14, ‘婈谂畛‘, 52, ‘B‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (15, ‘甔鼖苫‘, 96, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (16, ‘刘卟卅‘, 55, ‘A‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (17, ‘够負饶‘, 3, ‘D‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (18, ‘瀠禮翍‘, 14, ‘A‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (19, ‘仉余淳‘, 5, ‘C‘);
INSERT INTO `student`(`id`, `name`, `age`, `score`) VALUES (20, ‘坛唧笶‘, 59, ‘C‘);

思路

先来个最简单的分组,找出每一组最大的

mysql> select score,max(age) age from student group by score;
+-------+-----+
| score | age |
+-------+-----+
| A     |  55 |
| B     |  94 |
| C     |  77 |
| D     |  96 |
+-------+-----+
4 rows in set (0.03 sec)

但是这样无法得知id和name。

来个左连接查询

mysql> select a.id, a.name, a.age, a.score, b.age, b.score from student a left join (select score,max(age) age from student group by score) b on a.score = b.score and a.age = b.age;
+----+--------+-----+-------+------+-------+
| id | name   | age | score | age  | score |
+----+--------+-----+-------+------+-------+
|  4 | 敕搢謝 |  55 | A     |   55 | A     |
| 16 | 刘卟卅 |  55 | A     |   55 | A     |
|  8 | 溧况癈 |  94 | B     |   94 | B     |
|  2 | 穟玔檠 |  77 | C     |   77 | C     |
| 15 | 甔鼖苫 |  96 | D     |   96 | D     |
|  1 | 襠醞奪 |  70 | C     | NULL | NULL  |
|  3 | 繜翿宽 |  11 | A     | NULL | NULL  |
|  5 | 薰舒翎 |  86 | D     | NULL | NULL  |
|  6 | 贿怆軻 |  31 | B     | NULL | NULL  |
|  7 | 踰齁陈 |  26 | D     | NULL | NULL  |
|  9 | 捳縇睢 |  38 | D     | NULL | NULL  |
| 10 | 漲堔杙 |   0 | C     | NULL | NULL  |
| 11 | 輪塶讣 |  13 | B     | NULL | NULL  |
| 12 | 刪庝熽 |  53 | B     | NULL | NULL  |
| 13 | 鄀乹聐 |  90 | D     | NULL | NULL  |
| 14 | 婈谂畛 |  52 | B     | NULL | NULL  |
| 17 | 够負饶 |   3 | D     | NULL | NULL  |
| 18 | 瀠禮翍 |  14 | A     | NULL | NULL  |
| 19 | 仉余淳 |   5 | C     | NULL | NULL  |
| 20 | 坛唧笶 |  59 | C     | NULL | NULL  |
+----+--------+-----+-------+------+-------+
20 rows in set (0.08 sec)

左面的是原数据表的内容,右面多出来的两行是我们分组统计之后的数据。

两个查询调换位置或者用右连接查询,再加个排序

mysql> select a.id, a.name, b.age, b.score from student a right join (select score,max(age) age from student group by score) b on a.score = b.score and a.age = b.age order by b.score;
+----+--------+-----+-------+
| id | name   | age | score |
+----+--------+-----+-------+
|  4 | 敕搢謝 |  55 | A     |
| 16 | 刘卟卅 |  55 | A     |
|  8 | 溧况癈 |  94 | B     |
|  2 | 穟玔檠 |  77 | C     |
| 15 | 甔鼖苫 |  96 | D     |
+----+--------+-----+-------+
5 rows in set (0.07 sec)

 

MySQL查询:Group By 后取出每一组中最大的数据

原文地址:https://www.cnblogs.com/LUA123/p/13940847.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL查询:Group By 后取出每一组中最大的数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL查询:Group By 后取出每一组中最大的数据

环境:MySQL5.7版本先生成一组测试数据public static int randAge(){ return new Random().nextInt(100);}public static char randScore(){ int i =

	MySQL查询:Group By 后取出每一组中最大的数据
2015-03-20

MySQL分组查询获取每组最新的一条数据详解(group by)

目录业务场景:解决方案:group by id 方案验证:那怎么样才可以实现呢?使用 inner join 内连接,如下:总结业务场景:最近项目中迭代一个旧的功能,再原有的设计上进行功能拓展(因成本等原因,不考虑项目重构),其中设计到了这
MySQL分组查询获取每组最新的一条数据详解(group by)
2024-08-18

SQL Group By分组后如何选取每组最新的一条数据

经常在分组查询之后,需要的是分组的某行数据,例如更新时间最新的一条数据,下面这篇文章主要给大家介绍了关于SQL Group By分组后如何选取每组最新的一条数据的相关资料,需要的朋友可以参考下
2022-11-13

mysql 批量查询取每一组最新一条数据

本文介绍了在MySQL中批量查询获取每一组数据的最新一条记录的方法。通过创建临时表或直接查询原表,可以使用ROW_NUMBER()和MAX()函数来实现此目的。方法适用于分组查询,根据组别获取最新的记录。文中提供了详细的步骤和示例,有助于理解和应用该技术。
mysql 批量查询取每一组最新一条数据
2024-04-02

Mysql分组查询每组最新一条数据的三种实现方法

目录前言注意事项准备SQL错误原因方法一方法二(适用于自增ID和创建时间排序一致)方法三(适用于自增ID和创建时间排序一致)总结MAX()函数和MIN()这一类函数和GROUP BY配合使用存在问题前言在写报表功能时遇到一个需要根据用户i
2023-01-12

编程热搜

目录