协助清理MySQL连接查询以查找行之间的更改

协助清理MySQL连接查询以查找行之间的更改,mysql,join,otrs,Mysql,Join,Otrs,表大小~500000行,137MB,查询时间1.591秒 我是一名初级程序员,在基于MySQL的OTRS票证数据库上测试我的能力。我正在寻找票证在队列之间移动的实例。移动的指示符与新队列位于同一行,我设置了一个查询,试图返回同一票证id中同一列的上一个值 表中的票据示例: id history_type_id ticket_id queue_id create_time 377 1 30

表大小~500000行,137MB,查询时间1.591秒

我是一名初级程序员,在基于MySQL的OTRS票证数据库上测试我的能力。我正在寻找票证在队列之间移动的实例。移动的指示符与新队列位于同一行,我设置了一个查询,试图返回同一票证id中同一列的上一个值

表中的票据示例:

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
所讨论的行是380381383。移动的历史\u类型\u id值为16,且381上方的行具有票据的先前队列\u id。我能够构建的是一个查询,它检查任何id值之前的id值和history\u-type\u-idhistory\u-id,并且共享相同的ticket\u-id,并返回该行的队列\u-id(或者我假设是100%自学到这一点)。您可以假设,idcreate\u 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
我试图驾驶的是这样的返回:

 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

今天,我对这个问题困惑了好几个小时,当他们查询实际运行时,我非常高兴,但如果这些数字能够活下来,我会欣喜若狂的

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

在修改join语句以仅查看NewQ.id后面的OldQ.id时,它应该将结果限制为NewQ.id前面的单行。同样,未经测试,但您的查询中有一个小改动,看看它是否有效。

刚刚注意到这有多老了……派对有点晚了。哎呀!
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