我有两张桌子:
吨
ID | date | flag
1 | 2014-08-20 | 0
1 | 2014-08-21 | 0
1 | 2014-08-23 | 0
1 | 2014-08-25 | 0
1 | 2014-08-28 | 0
2 | 2014-08-24 | 0
û
ID | date_from | date_to
1 | 2014-08-20 | 2014-08-22
1 | 2014-08-27 | 2014-08-28
2 | 2014-08-27 | 2014-08-28
如果表t中的日期在表u的日期范围内,我想将'1'放入标志列。当然,对于每个个人ID。
所以我想在这种情况下:
ID | date | flag
1 | 2014-08-20 | 1
1 | 2014-08-21 | 1
1 | 2014-08-23 | 0
1 | 2014-08-25 | 0
1 | 2014-08-28 | 1
2 | 2014-08-24 | 0
我尝试了所有我能找到的例子,但是如果在表u中的任何一个范围内找到表t中的日期而不是确切的一个,我可以设法工作的唯一结果就是添加'1'期望的ID。因此标志栏填充了'1'。
答案 0 :(得分:1)
使用左连接(左表中的所有行)连接它,然后检查连接表中是否存在条目。如果是,则返回1,否则返回0。
select
t.*,
if(u.id is null, 0, 1) as my_flag
from
t
left join u on t.date between u.date_from and u.date_to
您也可以将其转换为更新声明:
update
t
left join u on t.date between u.date_from and u.date_to
set t.flag = if(u.id is null, 0, 1);