У меня есть следующая таблица tbl_crps , обратите внимание, что столбец crp встречается более одного раза, но id и start_on будут всегда отличаются в записях с одинаковыми crp .
id | crp | starts_on |
------------------
1 | 20 | 2020-02-09 |
2 | 31 | 2019-06-05 |
3 | 20 | 2018-01-10 |
4 | 31 | 2021-07-03 |
5 | 58 | 2022-01-01 |
6 | 58 | 2025-02-02 |
Мне нужно извлечь записи со следующими условиями:
Если для crp существует одна или несколько записей с прошлыми start_on , затем должна быть возвращена запись с наибольшим идентификатором среди этих записей с этими crp (записи с прошлой датой)
Если для crp записей с прошедшей датой не существует, то запись с наибольшим идентификатором среди всех записей с этим crp
Я могу успешно выбрать записи, соответствующие первому условию со следующим.
SELECT * FROM tbl_crps
AND id IN (SELECT MAX(b.id) FROM tbl_crps b WHERE b.starts_on <= "2020-10-02")
Вернет записи с идентификаторами 3 и 2.
Чего мне нужно добиться, так это добавить к результату те записи, которых start_on нет в прошлом и hich crp не в первом наборе результатов.
Возможно ли это? Может быть, так?
SELECT * FROM tbl_crps a
WHERE id IN (
SELECT MAX(a.id) FROM tbl_crps a WHERE a.starts_on <= "2020-10-02" GROUP BY a.crp
)
UNION
(
SELECT * FROM tbl_crps b
WHERE id IN (
SELECT MAX(c.id) FROM tbl_crps c WHERE c.starts_on > "2020-10-02"
AND c.crp NOT IN (
SELECT d.crp FROM tbl_crps d
WHERE id IN (
SELECT MAX(e.id) FROM tbl_crps e WHERE e.starts_on <= "2020-10-02" GROUP BY e.crp)
)
)
)
Я использую MySQL 5.7