Я пытаюсь вывести контракты из MySQL, которые скоро истекают. Что я сделал со следующим утверждением:
SELECT
c.id, c.file, c.user, c.contractno, c.startdate, c.enddate, f.name, f.path
FROM signedcontracts c
LEFT JOIN files f ON c.file = f.id
WHERE c.enddate < NOW() + INTERVAL 30 DAY
AND c.enddate > NOW()
ORDER BY c.enddate ASC
Но я не могу понять, как убедиться, что он не возвращает никаких контрактов для пользователей, у которых уже есть новый контракт в signedcontracts
.
Я получил его работу с этим запросом:
SELECT
c.id, c.file, c.user, c.contractno, c.startdate, c.enddate, f.name, f.path
FROM signedcontracts c
LEFT JOIN files f ON c.file = f.id
WHERE c.enddate < NOW() + INTERVAL 30 DAY
AND c.enddate > NOW()
AND c.user NOT IN (SELECT user FROM signedcontracts WHERE enddate > NOW() + INTERVAL 30 DAY)
ORDER BY c.enddate ASC
Которая проверяет, нет ли у пользователя договора с более чем 30 днями до enddate
Возможно, вам просто нужно проверить, нет ли даты окончания через 30 дней
MariaDB [sandbox]> select * from t;
+------+------------+------------+
| id | start_date | end_date |
+------+------------+------------+
| 1 | 2017-10-01 | 2017-10-31 |
| 1 | 2017-12-01 | 2017-12-31 |
| 2 | 2017-10-01 | 2017-12-31 |
| 2 | 2018-10-01 | 2018-10-31 |
| 3 | 2018-10-01 | 2018-10-31 |
| 4 | 2017-10-01 | 2018-10-31 |
+------+------------+------------+
6 rows in set (0.00 sec)
MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> select *
-> from t
-> where end_date between now() and now() + interval 30 day
-> and id not in (select id from t where end_date > now() + interval 30 day);
+------+------------+------------+
| id | start_date | end_date |
+------+------------+------------+
| 1 | 2017-12-01 | 2017-12-31 |
+------+------------+------------+
1 row in set (0.00 sec)