3

複雑なクエリを修正するための助けを得ようとしています。私は私の状況を以下に説明しています、ありがとう。

次の2つのテーブルがあります。

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

これは時計システムの一部です。ユーザーがチェックインするたびに、1 つのエントリがデータベースに記録されます。ユーザーの正しい動作は、常にペア レコードが記録されていることです。たとえば、user_id 123 のクロックは午後 1:07:06 で、再びクロックは午後 2:08:06 です。ただし、場合によっては、ユーザーが 1 回だけ実行することがあるため (データベースのレコードがペアになっていない)、レコードからその特定の時間だけ課金する必要があります。例として、2013 年 4 月 5 日のユーザー 124 です。

このクエリを機能させるために週末中ずっと試しています:(。正しい結果が得られたら、user_idを1つだけ取得する条件を追加します(例:user_id = 124)。

4

1 に答える 1

0

これができたとしても、潜在的な設計上の落とし穴がいくつかあると思います。

人々は 1 日に複数の期間出勤できますか? その場合、たとえば午前 10 時と午後 2 時の 2 つのレコードは合計 2 時間または 4 時間になります。

人々が午後 11 時に出勤し、午前 2 時に出勤したらどうなりますか?

一見すると、あなたのSQLは2つの異なる支払い率にまたがる期間を考慮しているとは思いませんか? このシナリオは、必ずテスト データに含める必要があります。

これを実装する場合は、おそらくロジックをコードに移動し、次のような時間列を 1 つだけにして価格表を簡素化します。

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

また、ユーザーがカードを 1 枚しか持っていない場合は、アクティビティ テーブルに card_id と user_id を含める必要がない場合があります。

于 2013-05-07T22:49:59.330 に答える