【发布时间】:2020-02-03 11:58:35
【问题描述】:
我正在尝试选择所有学生的最新记录(我不想要学生过去的成绩,只想要他们最近的成绩)。目前,它只返回一个结果。
学生成绩表
╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name │ grade │ date_added ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 1 │ bob │ 23 │ 2019-10-01 14:25:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 2 │ james │ 45 │ 2019-10-02 17:31:27 ║
╟────┼───────┼───────┼─────────────────────╢
║ 3 │ mike │ 42 │ 2019-10-03 18:08:13 ║
╟────┼───────┼───────┼─────────────────────╢
║ 4 │ bob │ 68 │ 2019-10-04 02:00:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5 │ mike │ 83 │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6 │ bob │ 23 │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7 │ james │ 86 │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝
我希望它返回什么
╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name │ grade │ date_added ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 5 │ mike │ 83 │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6 │ bob │ 23 │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7 │ james │ 86 │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝
我的sql语句
SELECT id, DISTINCT name, grade, max(date_added)
FROM student_grade
ORDER BY date_added DESC
或者是向我返回此详细信息的有效方式。我对如何获得这个有点困惑。
【问题讨论】:
-
这是一个很常见的问题。我在问题中添加了greatest-n-per-group 标签。你可以在这里获得大量的技术:stackoverflow.com/questions/tagged/…
-
使用这个 SELECT s_g.id,s_g.name,s_g.grade,s_g.date_added FROM student_grade s_g INNER JOIN ( SELECT name, max(grade) as maxgrade FROM student_grade GROUP BY name ) s_g1 ON s_g1 .name = s_g.name 和 s_g1.maxgrade = s_g.grade
-
@nbk 这样您将重新检索与每个学生的最高成绩而不是最新成绩匹配的行。因此,对于
bob记录,您将获得 id 4 而不是 6 -
我知道但id似乎只是一个自增值没有任何其他目的,所以我认为他不需要最大的id而不是最高的等级,但这应该事先询问跨度>
标签: mysql sql database greatest-n-per-group