0

アプリケーションベースのフィルタリングや複数のクエリに頼ることなく、mysqlで特定のクエリを実行できるかどうかを確認しようとしています。

基本的に、私には顧客テーブルがあり、すべての人(私の顧客ではない人を含む)の証明書テーブルがあります。

各顧客は複数の証明書を持つことができ、私は各証明書に有効期限を持っています。

証明書の有効期限が近づいている(2週間以内)顧客を選択できるようにしたいのですが、有効期限が長い別の証明書を持っていません。

最初の部分は簡単です。2つのテーブル間のssnに基づいて内部結合を実行します。ここで、where句は、現在から現在までの日付の終了日+2週間を次のように指定します。

 select certs.ssn, certs.cert_num, certs.cert_start, certs.cert_finish 
   from certs 
  INNER JOIN customers  ON certs.ssn = customers.ssn 
  where certs.cert_finish < Date_ADD(now(), INTERVAL 14 DAY) 
   and certs.cert_finish > now()

ただし、有効期限が長い他の証明書を持っている顧客を除外する方法を見つけることができません。

何かアイデアはありますか?前のクエリが返したssnsのみのmax(cert_finish)に基づくサブクエリを考えています。

4

1 に答える 1

1

これは、GROUPBYおよびHAVING句を使用して実行できます。

select customers.ssn, certs.cert_num, certs.cert_start, certs.cert_finish
from customers INNER JOIN
     certs
     ON certs.ssn = customers.ssn
group by customers.ssn
having sum(case when certs.cert_finish < Date_ADD(now(), INTERVAL 14 DAY) and 
                     certs.cert_finish > now()
                then 1 else 0
           end) > 0 and  -- has soon to expire certicate
       sum(case when certs.cert_finish > Date_ADD(now(), INTERVAL 14 DAY)
                then 1 else 0
           end) = 0      -- has no certificate that will expire later

追加の顧客情報が必要な場合は、これをサブクエリとして使用し、顧客テーブルに結合します。

于 2012-09-21T19:17:15.363 に答える