2

表大小 ~500,000 行,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。移动的history_type_id值为16,并且381上方的行具有票证的前一个queue_id。我能够构建的是一个查询,该查询在任何 id 值之前检查前一个id值,history_type_id16,并且共享相同的ticket_id并返回该行的queue_id(或者我假设。100% 自学到这一点)。你可以假设,idcreate_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

这“有效”,但以一种丑陋且可能不可接受的方式,它查找每个 ticket_id 的 OldQ.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

今天一直在困惑这个几个小时,当他们查询实际运行时我很高兴,但如果这些数字能够活跃起来,我会欣喜若狂

4

1 回答 1

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

在将连接语句修改为仅查看 NewQ.id 之后的 OldQ.id 后,它应该将结果限制为直接在 NewQ.id 之前的单行。同样,未经测试,但对您的查询稍作更改以查看它是否有效。

于 2014-10-10T19:09:22.080 回答