MySQL 中保存某一列的分组最大值的行

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 中保存某一列的分组最大值的行的相关内容,希望对您有所帮助。

数据库标签