Mysql查询以按节获取最大年龄,如果两个或两个以上具有相同年龄,则返回id最小的学生

Mysql查询以按节获取最大年龄,如果两个或两个以上具有相同年龄,则返回id最小的学生,mysql,sql,Mysql,Sql,我有一张学生表,上面有这样的临时测试值: 表学生 +----+-------------+-------+-----------+ | id | section_id | age | name | +----+-------------+-------+-----------+ | 1 | 1 | 18 | Justin | +----+-------------+-------+-----------+ | 2 | 2 |

我有一张学生表,上面有这样的临时测试值:

学生

+----+-------------+-------+-----------+
| 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函数,但我不知道如何使用它。

这将满足您的需要

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

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 FIDLE:

这将满足您的需要

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

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 FIDLE:

我只需使用相关子查询:

select s.*
from students s
where s.id = (select s2.id
              from students s2
              where s2.section_id = s.section_id
              order by s2.age desc, s2.id asc
              limit 1
             );

这几乎是表达逻辑的最简单方式。在
学生(部分、年龄、id)
上有一个索引,它也应该是性能最好的。

我只需要使用一个相关的子查询:

select s.*
from students s
where s.id = (select s2.id
              from students s2
              where s2.section_id = s.section_id
              order by s2.age desc, s2.id asc
              limit 1
             );

这几乎是表达逻辑的最简单方式。在
学生(部分,年龄,id)
上有一个索引,它应该也是最有效的。

最好存储一个人的出生日期,而不是他们的年龄,因为出生日期不会改变,而年龄每年都会改变。这一点很好。这可能是一个派生表。。。事实上,这和我现在的情况很不一样。这只是为了示范。。。谢谢你的评论。存储一个人的出生日期,而不是他们的年龄,这是一个很好的做法,因为出生日期不会改变,而年龄每年都会改变。这一点很好。这可能是一个派生表。。。事实上,这和我现在的情况很不一样。这只是为了示范。。。谢谢你的评论。谢谢你的回答。相关子查询肯定是我不熟悉的另一个领域…谢谢你的另一个答案。相关子查询肯定是我不熟悉的另一个领域。。。