web-dev-qa-db-ja.com

2つの日付範囲の間のレコードを検索するMYSQLクエリ

PHPおよびMySQLを使用してWebアプリケーションで作業しています。

2つのテーブルがあります

  1. 従業員

    employee_id     email_id
    3             [email protected]
    4             [email protected]
    5             [email protected]
    6             [email protected]
    7             [email protected]
    
  2. コーチング

    coaching_id     emp_id  start_date  end_date
     1               4      2014-05-01  2014-10-02
     2               5      2014-12-18  2015-01-22
    

開始日 "2015-01-22"や終了日などの指定された日付範囲のコーチングプログラムに登録されていない従業員を検索するクエリが欲しい「2015-03-12」。

今、私はこのようなクエリを使用しています、

SELECT employee_id 
FROM employee 
WHERE sup_id = 3 
AND employee_id NOT IN 
(
    SELECT emp_id 
    FROM (coaching) 
    WHERE (start_date NOT BETWEEN "2014-12-26" AND "2015-01-30") 
    AND (end_date NOT BETWEEN "2014-12-26" AND "2015-01-30")

)

私にはロジックがあります"指定されたstart_dateおよびend_dateにすでにコーチングプログラムに参加している従業員は、コーチングプログラムの対象外です。

例:開始日が「2014-12-26」で終了日が「2015-01-30」の場合。
ID 5の従業員は、開始日が「2014-12-18」で終了日が「2015-01-22」の別のコーチング活動を行っているため、このコーチングプログラムの対象外です。
ただし、ID 4の従業員、およびコーチング活動に参加していない他のすべての従業員は適格です

私のクエリのどこに問題がありますか

ありがとう

2
Bikram Pahi

クエリには論理的な欠陥があります。コーチングがターゲットウィンドウにない場合にのみ、コーチングを行っている人のリストにない人を見つけようとします。

代わりに、employee_idの従業員とコーチングテーブルを結合します。従業員のすべての行を使用しますが、stop_dateが希望の開始日以降(コーチングはウィンドウの開始後に終了します)で、start_dateがより小さいコーチングの行のみを使用しますまたは希望する終了日と同じ(ウィンドウが終了する前にコーチングが開始されます)。次に、コーチングで1つ以上の一致する行を持つ従業員を除外します。

SELECT e.id AS employee_id
  FROM employee e
  LEFT JOIN coaching c ON c.employee_id = e.id
                      AND c.end_date >= '2014-12-26'
                      AND c.start_date <= '2015-01-30'
 WHERE c.employee_id IS NULL;

ライブデモ: http://sqlfiddle.com/#!9/79b39/4

5