我这里有一张2位员工的时间表表.我将如何检索某位员工的行,该行的工作日程从星期一到星期天完整,从2016-08-15开始到2016-08-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;
}
顺便说一句,我还有另一个表需要与时间表表连接.但这似乎是错误的,因为我遇到了错误.我该如何解决?
解决方法:
在2016年8月15日至2016年8月21日之间有完整的时间表,意味着要安排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)