Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql日报_Mysql_Stored Procedures_Jointable - Fatal编程技术网

MySql日报

MySql日报,mysql,stored-procedures,jointable,Mysql,Stored Procedures,Jointable,我正试图得到一些帮助来修复我复杂的查询。我在下面解释我的情况,谢谢 我有以下两个表格: 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

我正试图得到一些帮助来修复我复杂的查询。我在下面解释我的情况,谢谢

我有以下两个表格:

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     50
124        April, 07 2013 00:00:00+0000     450
这是时钟系统的一部分。每次用户签入时,数据库中都会记录一个条目。正确的用户行为将是始终记录一条配对记录。例如,用户id 123在下午1:07:06开始计时,并在下午2:08:06再次计时。但是,在某些情况下,用户可能只执行一次(数据库中的未配对记录),因此只应从记录中收取该特定小时的费用。例如,2013年4月5日的用户124


我整个周末都在努力让这个查询正常工作:(.一旦我得到正确的结果,我将添加一个条件,以便只获得一个用户id(例如,其中用户id=124)。

我认为,即使您设法做到这一点,也存在一些潜在的设计陷阱:

人们每天是否可以打卡超过一段时间?如果是,那么就有两条记录 上午10点和下午2点可能总共需要2小时或4小时

如果人们晚上11点打卡,凌晨2点再打卡,会发生什么

快速看一眼,我认为您的sql没有考虑跨越两种不同薪酬的时间段?您肯定应该在测试数据中包含此场景

如果我要实现这一点,我可能会将逻辑转换为代码,并通过只包含一个时间列来简化价格表,如:

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

另外,如果用户只有一张卡,您可能不需要在活动表中包含卡id和用户id。

@Meherzad,您对上述最佳方法有何想法?感谢lotHi Paul,非常感谢您的参与,并对回复过迟表示歉意。我不知道这篇帖子已经回复。考虑到您的评论,我正在修改该帖子e设计使它更好。我会在这里张贴我所做的,一旦我完成。
TIME, PRICE
 00:00,  75.00
 08:00,  50.00
 20:00,  75.00