2013-04-07 2 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 часы в 13:07:06 и часы снова в 2:08:06 pm. Тем не менее, в некоторых ситуациях пользователь может сделать это только один раз (неспаренная запись в базе данных), и поэтому он должен оплачиваться только в тот час из записи. Например, пользователь 124 в день 5/5/2013.

Я пытаюсь все выходные, чтобы получить этот запрос работает :(. После того, как я получить правильный результат, я добавить условие, чтобы получить только один user_id также, (например, когда user_id = 124).

+0

@Meherzad, любая идея о наилучшем подходе к вышеуказанному? Большое спасибо – carol1287

ответ

0

Я думаю, даже если вам удастся сделать это там некоторые потенциальные проблемы дизайна:

люди могут часами в течение более 1 периода в день Если да, то 2 записи, например 10 утра и 2pm может составить 2hours или 4hours

.

Что произойдет, если люди начнут часы в 11 часов вечера и снова в 2 часа ночи?

С кратким взглядом я не думаю, что ваш sql учитывает периоды времени, которые охватывают две разные ставки оплаты? Вы обязательно должны включить этот сценарий в свои тестовые данные.

Если бы я собирался осуществить это, я бы, вероятно, переместить логику в код, и упростить таблицу цен имея только столбец один раз как:

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

Кроме того, если пользователь имеет только одну карту вы, возможно, не нужно иметь card_id и user_id в таблице действий.

+1

Привет, Пол, большое спасибо за вмешательство и извиниться за поздний ответ. Я не знал, что на этот пост был дан ответ. Принимая во внимание ваши комментарии, я модифицирую дизайн, чтобы сделать его лучше. Я отправлю здесь то, что я сделал, как только закончу. – carol1287

Смежные вопросы