我正在尝试帮助修复我的复杂查询。我在下面解释我的情况,谢谢。
我有以下两个表:
ACTIVITY TABLE:
ID USER_ID CARD_ID CLOCK
1 123 04675545 4/3/2013 1:07:06 PM
2 123 04675545 4/3/2013 2:08:06 PM
3 124 04675550 4/3/2013 2:07:06 PM
4 124 04675550 4/3/2013 4:07:06 PM
5 124 04675550 4/4/2013 10:07:06 AM
6 124 04675550 4/4/2013 2:00:00 PM
7 124 04675550 4/5/2013 4:07:06 PM
8 124 04675550 4/7/2013 8:00:00 AM
9 124 04675550 4/7/2013 5:00:00 PM
PRICE TABLE:
ID FROMTIME TOTIME PRICEPERHOUR
1 08:00:00 19:59:59 50.00
2 20:00:00 07:59:59 75.00
以下查询:
select a.user_id, date(a.clock), ABS(TIME_TO_SEC(TIMEDIFF(a.clock, b.clock))/3600)*c.PRICEPERHOUR as total from
(Select if((@rn:=@rn+1)%2=0,@rn,@rn-1) As rId, act.* from act
join (select @rn:=-1)a
order by user_Id, clock) a
inner join
(Select if((@rn1:=@rn1+1)%2=0,@rn1,@rn1-1) As rId, act.* from act
join
(select @rn1:=-1)b
order by user_Id, clock) b
ON a.rid=b.rid AND a.id <> b.id
inner join
price c
on
TIME_TO_SEC(a.clock) between TIME_TO_SEC(c.FROMTIME)
AND
TIME_TO_SEC(c.TOTIME)
group by a.user_id, date(a.clock)
我得到以下结果:
USER_ID DATE(A.CLOCK) TOTAL
123 April, 03 2013 00:00:00+0000 50.8333
124 April, 03 2013 00:00:00+0000 100
124 April, 04 2013 00:00:00+0000 194.0833
124 April, 05 2013 00:00:00+0000 1,994.0833
124 April, 07 2013 00:00:00+0000 1,994.0833
但是,我试图改变这个结果:
USER_ID DATE(A.CLOCK) TOTAL
123 April, 03 2013 00:00:00+0000 50.8333
124 April, 03 2013 00:00:00+0000 100
124 April, 04 2013 00:00:00+0000 194.0833
124 April, 05 2013 00:00:00+0000 50
124 April, 07 2013 00:00:00+0000 450
这是时钟系统的一部分。每次用户登记时,都会在数据库中记录一个条目。正确的用户行为将是它始终记录一对记录。例如,user_id 123在下午1:07:06开始计时,并在下午2:08:06再次开始计时。但是,在某些情况下,用户可能只执行一次(数据库中的未配对记录),因此只应从记录中的特定小时收费。例如,用户124在2013年4月5日。
我正在尝试整个周末让这个查询工作:(。一旦我得到正确的结果,我将添加一个条件,也只获得一个user_id,(例如user_id = 124)。
答案 0 :(得分:0)
我认为即使你设法做到这一点,也存在一些潜在的设计缺陷:
人们每天可以超过1个时间吗?如果是,则以2个记录为例 上午10点和下午2点可能总共2小时或4小时。
如果人们在晚上11点和凌晨2点再次上班会怎么样?
从快速浏览一下,我不认为你的sql会考虑跨越两种不同工资率的时间段吗?您绝对应该在测试数据中包含此方案。
如果我要实现这个,我可能会将逻辑移到代码中,并通过只有一个时间列来简化价格表:
TIME, PRICE
00:00, 75.00
08:00, 50.00
20:00, 75.00
此外,如果用户只有一张卡,您可能不需要在活动表中使用card_id和user_id。