2016-08-20 56 views
3

我在這裏有一張2名員工的時間表。我將如何獲取一定的員工具有不同於一個完整的時間表的行星期一星期日2016年8月15日開始高達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 | 

所以基本上應該找回EMP 2只的條目這是輸出應該如何

| 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週一和週二章附表也應該被檢索。

修訂

其實我在笨並與我已經設法把它翻譯成笨活動記錄語法的答案的幫助應用此,這是我的代碼看起來像:

$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

在更新之前,這是一個相當好的問題。所以我建議你: - 回滾你的更新 - Upvote這兩個答案 - 接受Mureiniks答案 - 學習調試你的代碼 - 刪除你的ON子句中的';' –

回答

2

2016-08-152016-08-21的完整時間表意味着安排了七天。所以,你可以只檢查安排在這個時間內的天數,並確保你有七(不同)的:

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 
       ); 
相關問題