2013-04-07 224 views
3

我想获得一些帮助修复我的复杂查询。我正在解释我的情况,谢谢。MySql每日报告

我有以下两个表:

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:[email protected]+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:[email protected]+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 pm再次钟表。但是,在某些情况下,用户可能只做一次(数据库上的未配对记录),因此只应在记录的特定小时内收取费用。作为示例,用户124在2013年4月5日。

我想所有的周末获得此查询工作:(。一旦我得到正确的结果,我会加一个条件,(例如在USER_ID = 124)。

+0

@Meherzad,关于上述最佳方法的任何想法?非常感谢 – carol1287 2013-04-08 02:35:43

回答

0

我想只得到一个同样的user_id即使你设法做到这一点有一些潜在的设计缺陷:

可以在每天超过1期人时钟如果是这样那么2个记录例如 上午10时和下午总额可能2小时或4小时

如果人们在晚上11点钟,然后在凌晨2点钟声,会发生什么?

快速浏览一下,我不认为你的SQL考虑了跨越两种不同薪酬的时间段?您应该将这种情况明确地包含在测试数据中。

如果我要实现这一点,我可能会移动逻辑转换成代码,并且只具有一个时间列简化价格表所示:

TIME, PRICE 
00:00, 75.00 
08:00, 50.00 
20:00, 75.00 

此外,如果用户只有一个卡,你可以不需要在活动表中拥有card_id和user_id。

+1

嗨保罗,非常感谢你的加入,我对迟到的回应表示歉意。我不知道这个帖子是回答。考虑到您的意见,我正在修改设计以使其更好。我会在这里发布我刚完成的工作。 – carol1287 2013-05-17 05:48:43