2013-08-09 2 views
2
размера

Таблицы ~ 500000 строк, 137MB, время запроса 1,591 секОказание помощи в При очистке MySQL Query Присоединяйтесь, чтобы найти изменения в междурядьях

Я младший программист тестирования моего пыла на нашей основе MySQL OTRS базах данных билета. Я ищу экземпляры, в которых билет перемещается между очередями. Индикатор перемещения существует в той же строке, что и новая очередь, и я настроил запрос, который пытается вернуть предыдущее значение того же столбца в одном и том же идентификаторе.

Пример билета в таблице:

id history_type_id ticket_id queue_id   create_time 
377     1   30   2 2012-09-14 11:06:02 
378    21   30   2 2012-09-14 11:06:02 
379    12   30   2 2012-09-14 11:06:02 
380     4   30   2 2012-09-14 11:06:02 
381    16   30   8 2012-09-14 11:08:29 
383    16   30   2 2012-09-14 11:09:54 
384    17   30   2 2012-09-14 11:11:28 
          *** Stuff Happens *** 
396    27   30   2 2012-09-14 11:22:06 
397    18   30   2 2012-09-14 11:22:06 

Строки о которых идет речь , и . history_type_id значение для движения является , и строка выше имеет предыдущее queue_id билета. То, что я был в состоянии построить запрос, который проверяет предыдущий ID значение перед любым идентификатора значения с history_type_id из и разделяет те же TICKET_ID и вернуть queue_id из этой строки (или так я предполагаю, что 100% самообучается в этом вопросе). Как вы можете предположить, id и create_time не ограничены в каждом билете и не могут быть надежно использованы для сортировки.

Вот запрос:

SELECT OldQ.id, 
     OldQ.queue_id AS OldOne, 
     OldQ.create_time AS FirstQ, 
     NewQ.id, 
     NewQ.queue_id AS NewOne, 
     NewQ.create_time AS LastQ, 
     OldQ.ticket_id 
FROM ticket_history AS OldQ 
    JOIN ticket_history AS NewQ 
     ON OldQ.id < NewQ.id 
     AND OldQ.ticket_id = NewQ.ticket_id 
WHERE NewQ.history_type_id = '16' 
ORDER BY NewQ.ticket_id, 
     NewQ.id, 
     OldQ.id 

Этот «работает», но в уродливом и, вероятно, недопустимым образом, это выглядит для каждого значения OldQ.id на TICKET_ID, а не только один перед NewQ.id, и именно там я попал в блокпост. У меня есть полезные данные, но это гораздо больше, чем мне нужно. Например, здесь есть выход для вышеприведенного билета:

id OldOne    FirstQ id NewOne     LastQ ticket_id 
377  2 2012-09-14 11:06:02 381  8 2012-09-14 11:08:29   30 
378  2 2012-09-14 11:06:02 381  8 2012-09-14 11:08:29   30 
379  2 2012-09-14 11:06:02 381  8 2012-09-14 11:08:29   30 
380  2 2012-09-14 11:06:02 381  8 2012-09-14 11:08:29   30 
377  2 2012-09-14 11:06:02 383  2 2012-09-14 11:09:54   30 
378  2 2012-09-14 11:06:02 383  2 2012-09-14 11:09:54   30 
379  2 2012-09-14 11:06:02 383  2 2012-09-14 11:09:54   30 
380  2 2012-09-14 11:06:02 383  2 2012-09-14 11:09:54   30 
381  8 2012-09-14 11:08:29 383  2 2012-09-14 11:09:54   30 

Где я пытаюсь добраться до было бы возвращение таких, как это:

id OldOne    FirstQ id NewOne     LastQ ticket_id 
380  2 2012-09-14 11:06:02 381  8 2012-09-14 11:08:29   30 
381  8 2012-09-14 11:08:29 383  2 2012-09-14 11:09:54   30 

Been озадачивает этот в течение нескольких часов сегодня , Я был так рад, когда они спрашивали, что на самом деле побежал, но если эти числа могут ожить, я буду в восторге

ответ

0

Sytharin, я еще не смог проверить это, но решение, которое, я считаю, будет работать для вас является следующим:

SELECT 
    OldQ.id, 
    OldQ.queue_id AS OldOne, 
    OldQ.create_time AS FirstQ, 
    NewQ.id, 
    NewQ.queue_id AS NewOne, 
    NewQ.create_time AS LastQ, 
    OldQ.ticket_id 
FROM ticket_history AS OldQ 
JOIN ticket_history AS NewQ 
    ON NewQ.id - 1 = OldQ.id 
    AND OldQ.ticket_id = NewQ.ticket_id 
WHERE 
    NewQ.history_type_id = '16' 
ORDER BY 
    NewQ.ticket_id, 
    NewQ.id, 
    OldQ.id 

При изменении утверждения соединения только посмотреть на OldQ.id непосредственно за NewQ.id, он должен ограничивать результаты одной строкой, непосредственно предшествующей NewQ.id. Опять же, непроверенный, но небольшое изменение в вашем запросе, чтобы увидеть, работает ли оно.

+0

Просто заметил, сколько лет было ... немного поздно для вечеринки. К сожалению! – adamjboyce

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

  • Нет связанных вопросов^_^