表大小 ~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
有问题的行是380、381和383。移动的history_type_id值为16,并且381上方的行具有票证的前一个queue_id。我能够构建的是一个查询,该查询在任何 id 值之前检查前一个id值,history_type_id为16,并且共享相同的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
这“有效”,但以一种丑陋且可能不可接受的方式,它查找每个 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
今天一直在困惑这个几个小时,当他们查询实际运行时我很高兴,但如果这些数字能够活跃起来,我会欣喜若狂