mysql: пытается сгруппировать записи по части их значений - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь выполнить SQL-запрос выбора, чтобы получить определенные записи и сгруппировать их по определенному значению поля.

У меня есть таблица с именем courses, которая выглядит следующим образом:

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

последняя часть поля "короткое имя" представляет семестр. («2019a», «2018a» и т. Д.) номер («20115», «10112» и т. д.) - название курса.

Мне нужен SQL-запрос, который даст мне запись с последним семестром каждого курса.

В приведенном выше примере я хочу, чтобы результат был:

  • 5, 20115-2019b (потому что 2019b - последний семестр 20115)
  • 6, 10112-2020a (потому что 2020a - последний семестр 10112)
  • 7, 43112-2017a (потому что 2017a - последний семестр 43112)

Это то, что я пробовал до сих пор:

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

Но это, кажется, дает мне первый вместо последнего курса

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы можете использовать 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 |
0 голосов
/ 04 июня 2019

Вы можете попробовать

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...