2016-08-20 8 views
3

私はここで2人の従業員のスケジュールのテーブルを持っています。どのように私は日曜日に月曜日からの完全なスケジュールを持っている特定の従業員の行を取得しますので、基本的に2016年8月21日SQLすべての条件を満たす場合に行を取得します

| id | emp_id | date | day | 
|----|--------|------------|-----| 
| 1 | emp1 | 2016-08-17 | Wed | 
| 2 | emp1 | 2016-08-18 | Thu | 
| 3 | emp1 | 2016-08-19 | Fri | 
| 4 | emp1 | 2016-08-20 | Sat | 
| 5 | emp1 | 2016-08-21 | Sun | 
| 6 | emp2 | 2016-08-15 | Mon | 
| 7 | emp2 | 2016-08-16 | Tue | 
| 8 | emp2 | 2016-08-17 | Wed | 
| 9 | emp2 | 2016-08-18 | Thu | 
| 10 | emp2 | 2016-08-19 | Fri | 
| 11 | emp2 | 2016-08-20 | Sat | 
| 12 | emp2 | 2016-08-21 | Sun | 

件まで2016年8月15日から始まるこれは、出力が

| 6 | emp2 | 2016-08-15 | Mon | 
| 7 | emp2 | 2016-08-16 | Tue | 
| 8 | emp2 | 2016-08-17 | Wed | 
| 9 | emp2 | 2016-08-18 | Thu | 
| 10 | emp2 | 2016-08-19 | Fri | 
| 11 | emp2 | 2016-08-20 | Sat | 
| 12 | emp2 | 2016-08-21 | Sun | 

どうあるべきかである。しかしEMP1は月曜日と火曜日には、それはまた、検索されなければならないschedの持っている場合、EMP 2のエントリのみを取得する必要があります。

は、実際に私はCodeIgniterの中で、私はCodeIgniterのアクティブなレコード構文に翻訳するために管理してきた回答の助けを借りてこれを適用してい

を更新し、これが私のコードがどのように見えるかであるように:

$schedule = $this->db->query("SELECT * 
       FROM schedule 
       LEFT JOIN employees 
       ON employees.user_id = schedule.user_id; 
       WHERE schedule.user_id IN (SELECT user_id 
            FROM schedule 
            WHERE start >= '2016-08-15' and start <= '2016-08-21' 
            group by user_id 
            having count(*) = 7 
           ); "); 


if($schedule->num_rows() > 0) { 
    return $schedule->result_array(); 
    } else { 
     return false; 
    } 

ところで、私はスケジュール表と結合する必要のある別の表も持っています。しかし、これは間違った方法であると思われます。私はこれをどのように解決すべきですか?

+0

あなたはすべてのEMP2のエントリのみ指定した日付範囲内のものをしたいかどうかを指定してください。 –

+0

私は指定された日付範囲内のemp2のエントリだけが必要です – Pretorian

+1

更新前はかなり良い質問でした。あなたの更新をロールバックする - 両方の答えをアップアップする - Mureiniksの回答を受け入れる - あなたのコードをデバッグする方法を学ぶ - あなたのON句で ';'を削除する –

答えて

2

2016-08-15から2016-08-21までのスケジュールは、7日間の予定です。だから、ちょうどこの時間枠内で予定の日数を確認し、7(異なる)のものを持っていることを確認することができます:

SELECT * 
FROM schedule 
WHERE `date` >= '2016-08-15' AND 
     `date` <= '2016-08-21' AND 
     emp_id IN (SELECT emp_id 
        FROM  schedule 
        WHERE `date` >= '2016-08-15' AND `date` <= '2016-08-21' 
        GROUP BY emp_id 
        HAVING COUNT(DISTINCT `date) = 7) 
+0

@Murenikありがとう:)ありがとう – Pretorian

1

これはあなたがやりたいのか?

select emp_id 
from t 
where date >= '2016-08-15' and date <= '2016-08-21' 
group by emp_id 
having count(*) = 7; 

詳細な記録を取得するには、使用することができますjoinin、またはexists

select t.* 
from t 
where t.emp_id in (select emp_id 
        from t 
        where date >= '2016-08-15' and date <= '2016-08-21' 
        group by emp_id 
        having count(*) = 7 
       ); 
関連する問題