PHPおよびMySQLを使用してWebアプリケーションで作業しています。
2つのテーブルがあります
従業員
employee_id email_id
3 [email protected]
4 [email protected]
5 [email protected]
6 [email protected]
7 [email protected]
コーチング
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の従業員、およびコーチング活動に参加していない他のすべての従業員は適格です
私のクエリのどこに問題がありますか
ありがとう
クエリには論理的な欠陥があります。コーチングがターゲットウィンドウにない場合にのみ、コーチングを行っている人のリストにない人を見つけようとします。
代わりに、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;