2017-12-16 17 views
0

私は間もなく期限切れとなる契約書をMySQLから引き出しようとしています。これは、私は次の文で行った:最新のレコードがない場合は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に新しい契約を結んでいるユーザーのための任意の契約を返さないことを確認する方法を見つけ出すことはできません。

+1

まで30日以上の契約があります。 –

+0

どのようなデータが必要ですか? – MartijnICU

+0

[mcve]を読んで行動してください。 PS「新しい契約を結んでいる」とはどういう意味ですか?左テーブルの行をすべて表示したくない場合は、なぜ参加していませんか? – philipxy

答えて

0

が、私はそれがこのクエリでの作業しまった後の終了日がないことを確認する必要があります:ユーザーが「doesnのかどうかを確認する

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 

可能であれば、ご質問にデータを追加してください。enddate

1

はおそらく、あなたは今+ 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) 
関連する問題