Mysql 如何两次从表中获取字段(在不同条件下)?

Mysql 如何两次从表中获取字段(在不同条件下)?,mysql,Mysql,我有一个名为Reader的表,其中id、date、time作为字段。时间字段包含员工的进入时间和离开时间,因此我希望根据特定id和日期范围的两个条件两次检索时间中的值: 1.In-time:Time between '9:00:00' and '12:00:00' 2.Out-time:Time between '15:00:00' and '19:00:00' 命令应该是这样的 select id,tim,tim,dat from reader where tim between '09:

我有一个名为Reader的表,其中id、date、time作为字段。时间字段包含员工的进入时间和离开时间,因此我希望根据特定id和日期范围的两个条件两次检索时间中的值:

1.In-time:Time between '9:00:00' and '12:00:00'
2.Out-time:Time between '15:00:00' and '19:00:00'
命令应该是这样的

select id,tim,tim,dat from reader 
where tim between '09:00:00' and '14:00:00' 
and   tim between '15:00:00' and '17:00:00' 
and dat between '2011-01-17' and '2011-01-19' 
and id =10704 ;

你应该可以这样做: (我假设您有另一个字段提供输入或输出信息。否则,您的查询基于一个非常弱的假设。但是:

SELECT r1.id, r1.tim, r2.tim, r1.dat 
FROM reader AS r1, reader AS r2 
WHERE r1.id = 10704 AND r2.id = 10704
    AND r1.tim BETWEEN '09:00:00' AND '14:00:00' 
    AND r2.tim BETWEEN '15:00:00' AND '17:00:00' 
    AND r1.dat BETWEEN '2011-01-17' AND '2011-01-19';
请注意,我将id的条件放在最上面,假设它是限制性最强的条件,因此可能会获得一些性能(在好的情况下,查询优化器可能会自己这样做)

干杯 蒂洛

您需要在时间之间使用OR,而不是和,因为时间永远不可能在两个不相交的范围内。请确保将该部分条件括起来,否则您的AND/OR将无法正常工作

上面给出了单独行中的数据。 要使它们在同一记录上保持一致,您可以使用,假设每天每个范围内只有一次

select rin.id,rin.tim,rout.tim as timeout,rin.dat
from reader rin
left join reader rout on rout.id=rin.id
    and rout.tim between '15:00:00' and '17:00:00'
    and rin.dat = rout.dat
where rin.tim between '09:00:00' and '14:00:00'
and rin.dat between '2011-01-17' and '2011-01-19' 
and rin.id =10704
union all
select rout.id,rin.tim,rout.tim as timeout,rout.dat
from reader rout
left join reader rin on rout.id=rin.id
    and rin.tim between '09:00:00' and '14:00:00'
    and rin.dat = rout.dat
where rout.tim between '15:00:00' and '17:00:00'
and rout.dat between '2011-01-17' and '2011-01-19' 
and rout.id =10704
and rout.id is null

这个特殊的UNION ALL表单模拟了MySQL中缺少的完整联接。即使员工在任何一天打卡上班但不出门,或者下班但不上班,您也可以看到数据。

我认为,如果您想将一天的进出分组成一行,那么在Thilo的代码中添加
和r1.dat=r2.dat
可能会很有用。

第一个是只给出一个值(时间)我没有得到你的第二个代码……你能给我更多的了解吗……正如我已经说过的,我只有一个字段时间……条目b/w 9-12是及时的,3-7是超时的……我需要一种方法来获取它。我没有任何其他字段指定它是输入还是输出,我没有两个读卡器表。我只有上面的1个代码,没有特殊的l字段。我想说的基本上是一个问题:如果我已经在13.55离开怎么办?但是,我的查询并没有假设你有两个不同的表。你查询(相同!)读表两次,然后将所有行放在一起——如果您不熟悉,请查阅联接背后的理论。之后,我们将筛选出所有符合我们要筛选的条件的行。不过,Royas注释是有效的。然后,在这里接受答案被认为是一种很好的方式(通过单击帮助您的答案左侧的复选标记)。
select rin.id,rin.tim,rout.tim as timeout,rin.dat
from reader rin
left join reader rout on rout.id=rin.id
    and rout.tim between '15:00:00' and '17:00:00'
    and rin.dat = rout.dat
where rin.tim between '09:00:00' and '14:00:00'
and rin.dat between '2011-01-17' and '2011-01-19' 
and rin.id =10704
union all
select rout.id,rin.tim,rout.tim as timeout,rout.dat
from reader rout
left join reader rin on rout.id=rin.id
    and rin.tim between '09:00:00' and '14:00:00'
    and rin.dat = rout.dat
where rout.tim between '15:00:00' and '17:00:00'
and rout.dat between '2011-01-17' and '2011-01-19' 
and rout.id =10704
and rout.id is null