2013-12-05 4 views
7

У меня есть 2 таблицы в базе данных MySQL. один называется tickets и другой ticket_updatesСреднее время отклика с использованием PHP/MySQL

билеты следующие столбцы:

  1. последовательность
  2. ticketnumber
  3. DateTime

и ticket_updates

  1. последовательность
  2. ticket_seq
  3. DateTime
  4. время_запуска
  5. EndTime

ticket_seq колонки в ticket_updates таблицы связей с ticketnumber столбца в таблице tickets. Может быть несколько строк в ticket_updates, ссылающихся на одну строку в таблице tickets.

Я хочу показать среднее время отклика на время, необходимое для ответа на билеты. столбец datetime - это полная метка времени, когда строка была добавлена ​​/ вставлена ​​(Y-m-d H:i:s)

Как я могу показать среднее время отклика, скажем, на прошлой неделе?

+0

Несомненно, столбец ticket_seq в таблице ticket_updates ссылается на столбец * sequence * в таблице билетов. "!?!?!? Хм, возможно, я прихожу к этому поздно ... – Strawberry

+0

Нет, он ссылается на столбец ticketnumber в таблице билетов, а не на столбец последовательности –

ответ

2

Из вашего чата остроумия Энди Джонс Я понимаю, что вы определяете время ответа на билет, как время, прошедшее между tickets.datetime и первым ticket_updates.datetime для этого билета. В этом случае следующий запрос возвращает среднее время ответа в секундах для билетов, добавленных за последние 7 дней.

SELECT avg(response_seconds) 
    FROM (
    SELECT time_to_sec(timediff(min(u.datetime), t.datetime)) AS response_seconds 
     FROM tickets t 
     JOIN ticket_updates u 
     ON t.ticketnumber = u.ticket_seq 
     WHERE t.datetime > now() - INTERVAL 7 day 
     GROUP BY t.ticketnumber) AS r 
+0

столбец в билетах является датой, а также в ticket_updates является datetime –

+0

@charliejsford Я обновил имя столбца. – rsanchez

+0

безупречный - спасибо. это выбирает строку, добавленную сначала в таблицу ticket_updates? –

0

Среднее значение суммы всех значений (в вашем случае вам нужно преобразовать дату и время в временную метку UNIX), а затем разделите эту сумму на общий счет. Преобразование может быть сделано с помощью MySQL с помощью команды, например

SELECT unix_timestamp(str_to_date('30/05/2011','%d/%m/%Y')); 

или в PHP при отображении результатов. Это зависит от логики и структуры вашего проекта.

+0

на данный момент у меня ничего нет, я не был уверен, с чего начать. –

+0

Я думаю, что это правильный путь, создайте структуры таблиц MySQL, затем заполните их значениями, а затем реализуйте сценарии PHP (или, если хотите, ASP), которые будут подключаться к базе данных и извлекать данные. – bodi0

+0

у вас есть полный пример, пожалуйста? –

1

Я собрал полный пример. Я предположил некоторые вещи о ваших данных - если столбцы имеют неправильные типы, измените их соответствующим образом. Я также собираюсь вернуть среднее время обновления в секундах.

CREATE TABLE tickets (
    sequence int(10) not null auto_increment primary key, 
    ticket_number int(10) not null default 0, 
    date_added timestamp, 
    index ticket_number_index (ticket_number) 
); 

INSERT INTO tickets (ticket_number, date_added) VALUES 
    (1, '2013-12-01 01:00:00'), 
    (2, '2013-12-15 02:00:00'), 
    (3, '2013-12-10 03:00:00'), 
    (4, '2013-12-13 04:00:00'), 
    (5, '2013-12-17 05:00:00'); 


CREATE TABLE ticket_updates (
    sequence int(10) not null auto_increment primary key, 
    ticket_number int(10) not null default 0, 
    date_added timestamp, 
    starttime datetime, 
    endtime datetime, 
    index ticket_number_index (ticket_number) 
); 

INSERT INTO ticket_updates (ticket_number, starttime, endtime, date_added) VALUES 
    (1, '2013-12-01 01:01:00', '2013-12-01 01:02:00', '2013-12-01 01:02:00'), 
    (1, '2013-12-01 01:01:00', '2013-12-01 01:02:00', '2013-12-01 01:02:00'), 
    (2, '2013-12-15 02:01:00', '2013-12-15 02:02:00', '2013-12-15 02:02:00'), 
    (2, '2013-12-15 02:01:00', '2013-12-15 02:02:00', '2013-12-15 02:02:00'), 
    (2, '2013-12-15 02:01:00', '2013-12-15 02:02:00', '2013-12-15 02:02:00'), 
    (2, '2013-12-15 02:02:00', '2013-12-15 02:02:50', '2013-12-15 02:02:50'), 
    (4, '2013-12-13 04:01:00', '2013-12-13 04:02:00', '2013-12-13 04:02:00'), 
    (4, '2013-12-13 04:01:00', '2013-12-13 04:05:30', '2013-12-13 04:05:30'), 
    (5, '2013-12-17 05:01:00', '2013-12-17 05:03:00', '2013-12-17 05:03:00'); 

Вы можете запустить этот запрос ...

SELECT SUM(TO_SECONDS(ticket_updates.date_added) - TO_SECONDS(tickets.date_added))/count(*) as update_time 
FROM tickets, ticket_updates 
WHERE tickets.ticket_number = ticket_updates.ticket_number AND 
    ticket_updates.date_added > now() - INTERVAL 1 WEEK 

Не уверен, если это совершенно точно, что вы ищете, - но это (и скрипка), может помочь переместить вас ближе к ответ.

См Fiddle: http://sqlfiddle.com/#!2/4c0acc/1

+0

Как рассчитать среднее время отклика для всех билетов за прошлые X дней? –

+0

'WHERE date_added> now() - INTERVAL 1 WEEK' только захватывает строки обновлений, добавленные за последнюю неделю, поэтому это должно вычислять среднее время отклика для всех билетов с последним X периодом. Вы можете перейти на 'now() - INTERVAL X DAY', если это работает лучше. –

+0

Я посмотрел на вашу скрипку и показывал несколько номеров билетов и update_time для каждого билета. Я хочу показать среднее время отклика ВСЕХ билетов в последний день/неделю ... –

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