首页 > 解决方案 > mysql:尝试按部分值对记录进行分组

问题描述

我正在尝试执行 sql 选择查询来获取某些记录并按某个字段值对它们进行分组。

我有一个名为的表courses,如下所示:

+----+----------+
| id | shortname|
+----+----------+
3, 20115-2019a
4, 10112-2018a
5, 20115-2019b
6, 10112-2020a
7, 43112-2017a

“shortname”字段的最后一部分代表一个学期。(“2019a”、“2018a”等)数字(“20115”、“10112”等)是课程名称。

我需要一个 sql 查询来获取每门课程最新学期的记录。

在上面的示例中,我希望结果为:

这是我到目前为止所尝试的:

SELECT id, MAX(shortname)
FROM courses

不行,只给我第一条记录。

我设法将课程名称与学期分开,并尝试按课程名称进行分组:

SELECT id, shortname,
SUBSTRING_INDEX(shortname, "-", 1) AS coursename, 
SUBSTRING(shortname, POSITION("-" IN shortname)+1, 7) AS semester
FROM courses 
GROUP BY coursename

但这似乎给了我第一个而不是最新的课程

标签: mysqlmariadb

解决方案


您可以使用not exists

select c.* from courses c
where not exists (
  select 1 from courses
  where 
    left(shortname, locate('-', shortname) - 1) =
    left(c.shortname, locate('-', c.shortname) - 1)
    and 
    substr(shortname, locate('-', shortname) + 1) > 
    substr(c.shortname, locate('-', c.shortname) + 1)
)

请参阅演示
结果:

| id  | shortname   |
| --- | ----------- |
| 5   | 20115-2019b |
| 6   | 10112-2020a |
| 7   | 43112-2017a |

推荐阅读