MySQL 中保存某一列的分组最大值的行
在 MySQL 数据库中,有时候需要按照某一列进行分组,同时还需要找出每个分组中某一列的最大值所在的行。这种需求可以通过使用 GROUP BY 和 MAX 函数来实现。
1. GROUP BY 和 MAX 函数的基本用法
在 MySQL 中,使用 GROUP BY 可以将查询结果按照指定列进行分组,常与聚合函数一起使用,例如 MAX、MIN、SUM、AVERAGE 等。
以一个学生成绩表为例:
CREATE TABLE score (
id int PRIMARY KEY AUTO_INCREMENT,
student_id int,
subject varchar(20),
score decimal(5,2)
);
INSERT INTO score (student_id, subject, score) VALUES
(1, 'Math', 86.5),
(1, 'English', 92.0),
(1, 'Chinese', 78.5),
(2, 'Math', 91.0),
(2, 'English', 85.5),
(2, 'Chinese', 90.0),
(3, 'Math', 88.0),
(3, 'English', 76.5),
(3, 'Chinese', 82.5);
如果想要按照学生进行分组,并且统计每个学生的最高分,可以这样查询:
SELECT student_id, MAX(score) AS max_score
FROM score
GROUP BY student_id;
查询结果如下:
+------------+-----------+
| student_id | max_score |
+------------+-----------+
| 1 | 92.00 |
| 2 | 91.00 |
| 3 | 88.00 |
+------------+-----------+
可以看到,查询结果按照学生进行了分组,同时统计了每个学生的最高分。
2. 获取各组最大值所在的行
假设现在需要获取每个科目的最高分对应的学生姓名和分数,可以先按照科目分组,再获取每个分组中 score 最大值的行。这可以通过以下几步实现:
使用 INNER JOIN 将 score 表与自身进行连接;
根据科目和最大分数进行筛选,并统计每个科目的最大分数;
将结果与 score 表再次进行连接,根据科目和最大分数获取对应的行。
查询语句如下:
SELECT s1.subject, s1.score, s2.student_id
FROM score s1
INNER JOIN (
SELECT subject, MAX(score) AS max_score
FROM score
GROUP BY subject
) s2 ON s1.subject = s2.subject AND s1.score = s2.max_score
ORDER BY s1.subject;
查询结果如下:
+---------+-------+------------+
| subject | score | student_id |
+---------+-------+------------+
| Chinese | 90.00 | 2 |
| English | 92.00 | 1 |
| Math | 91.00 | 2 |
+---------+-------+------------+
可以看到,查询结果按照科目进行了分组,并获取了各组最大值所在的行。
3. 保存各组最大值所在的行
如果需要将各组最大值所在的行保存到另一个表中,可以使用 INSERT INTO SELECT 语句。这个查询语句与前面的查询语句类似,只需要在结果集前加上 INSERT INTO 子句并指定目标表名即可。
以保存各科目最高分对应的学生为例:
CREATE TABLE max_score (
id int PRIMARY KEY AUTO_INCREMENT,
subject varchar(20),
score decimal(5,2),
student_id int
);
INSERT INTO max_score (subject, score, student_id)
SELECT s1.subject, s1.score, s2.student_id
FROM score s1
INNER JOIN (
SELECT subject, MAX(score) AS max_score
FROM score
GROUP BY subject
) s2 ON s1.subject = s2.subject AND s1.score = s2.max_score
ORDER BY s1.subject;
查询 max_score 表的内容:
+----+---------+-------+------------+
| id | subject | score | student_id |
+----+---------+-------+------------+
| 1 | Chinese | 90.00 | 2 |
| 2 | English | 92.00 | 1 |
| 3 | Math | 91.00 | 2 |
+----+---------+-------+------------+
可以看到,max_score 表中保存了各科目最高分对应的学生。
4. 总结
在 MySQL 中,使用 GROUP BY 和 MAX 函数可以方便地获取各组最大值,可以通过连接自身、INNER JOIN 和 INSERT INTO SELECT 等方法获取各组最大值所在的行并保存到另一个表中。
值得注意的是,在使用 GROUP BY 时需要遵循 SQL 标准,即 SELECT 关键字后面只能跟着分组函数、聚合函数或列名,否则会 MySQL 会报错。
此外,如果查询结果中包含重复数据,可以使用 DISTINCT 关键字来去重。
以上就是 MySQL 中保存某一列的分组最大值的行的相关内容,希望对您有所帮助。