我正在尝试执行一个select查询来获取某些记录,并根据某个字段值对它们进行分组。
我有一个名为courses的表,如下所示:
+----+----------+
| id | shortname|
+----+----------+
3, 20115-2019a
4, 10112-2018a
5, 20115-2019b
6, 10112-2020a
7, 43112-2017a“短名”字段的最后一部分表示了一个学期。("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但这似乎给了我第一个而不是最近的课程。
发布于 2019-06-04 09:20:21
你可以试试
select B.id, B.shortname
from courses B inner join
(SELECT SUBSTRING_INDEX(shortname, "-", 1) AS coursename
, Max(SUBSTRING(shortname, POSITION("-" IN shortname)+1, 7)) AS semester
FROM courses
group by coursename ) A
on B.shortname = CONCAT(A.coursename, "-",A.semester)这是您的问题的小提琴,http://sqlfiddle.com/#!9/907eb/10
发布于 2019-06-04 09:54:50
您可以使用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 |https://stackoverflow.com/questions/56440619
复制相似问题