2013-04-07 274 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