首页 > 解决方案 > Mysql查询按部分获取最大年龄,如果两个或更多具有相同年龄,则返回具有最小ID的学生

问题描述

我有一个临时测试值的学生表,如下所示:

学生

+----+-------------+-------+-----------+
| id | section_id  |  age  | name      |
+----+-------------+-------+-----------+
| 1  | 1           | 18    | Justin    |
+----+-------------+-------+-----------+
| 2  | 2           | 14    | Jillian   |
+----+-------------+-------+-----------+
| 3  | 2           | 16    | Cherry    |
+----+-------------+-------+-----------+
| 4  | 3           | 19    | Ronald    |
+----+-------------+-------+-----------+
| 5  | 3           | 21    | Marie     |
+----+-------------+-------+-----------+
| 6  | 3           | 21    | Arthur    |
+----+-------------+-------+-----------+

我想查询该表,以便获得每个部分的所有最大年龄。但是,如果两个学生的年龄相同,则生成的表将返回 id 最小的学生。

返回:

+----+------------+-----+--------+
| id | section_id | age | name   |
+----+------------+-----+--------+
| 1  | 1          | 18  | Justin |
+----+------------+-----+--------+
| 3  | 2          | 16  | Cherry |
+----+------------+-----+--------+
| 5  | 3          | 21  | Marie  |
+----+------------+-----+--------+

我试过这个查询:

SELECT ANY_VALUE(id), ANY_VALUE(section_id), MAX(age), ANY_VALUE(name) FROM
(SELECT id, section_id, age, name FROM students ORDER BY id) as X
GROUP BY section_id

不幸的是,有些情况下 id 与年龄和姓名不匹配。

我有:

sql_mode = only_full_group_by

而且我没有编辑它的特权,因此是 any_value 函数,但我不知道如何使用它。

标签: mysqlsql

解决方案


这将做你想要的。

它首先查找每个部分的最大年龄(包括重复项)。然后它将这些结果与每个部分的最小 id 连接起来(以消除重复)。最后,为匹配的 id 和 section 组合选择所有字段。

SELECT s3.*
FROM students s3
INNER JOIN (
    SELECT MIN(s2.id) AS id, s2.section_id
    FROM students s2
    INNER JOIN (
        SELECT s1.section_id, MAX(s1.age) AS age
        FROM students s1
        GROUP BY s1.section_id  
    ) s1 USING (section_id, age)
    GROUP BY s2.section_id
) s2 USING (id, section_id);

工作 SQL 小提琴:https ://www.db-fiddle.com/f/aezgAYM6A5KnXykceB7At1/0


推荐阅读