我这里有一张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表连接。但这似乎是错误的方式因为我得到了一个错误。我该如何解决这个问题?
答案 0 :(得分:2)
从2016-08-15
到2016-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;
要获取详细记录,您可以使用join
,in
或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
);