SQL如果满足所有条件,则获取行

时间:2016-08-20 11:31:54

标签: mysql sql codeigniter

我这里有一张2名员工的时间表。如何从星期一星期日检索具有完整时间表的某个员工的行,并从 2016-08-15 2016年8月21日

| 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有星期一和星期二的调查,它也应该被检索。

已更新

实际上我在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;
    }

顺便说一句,我还有另一个表需要与schedule表连接。但这似乎是错误的方式因为我得到了一个错误。我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

这样做你想要的吗?

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

要获取详细记录,您可以使用joininexists

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
                  );