我正在处理一个设计糟糕的表格,无法找出更快的查询。由前一个dev编写的当前查询需要20秒才能运行。
有18k记录称为“备注”,具有topic_id,日期和紧急程度。我需要所有被认为是“紧急”的记录。对于紧急情况的说明,它必须具有2的紧急程度。但是,如果由于最近的2级说明,有一个3级,4级或5级的说明,则说明不紧急。同一主题。换句话说,当主题获得2级音符时,它被认为是紧急的,直到它获得3级,4级或5级音符。如果它收到另一张纸条,则再次被认为是紧急的。
我需要获得所有紧急笔记。在我的脑海中,它是这样的:
据我所知,18k记录都涉及1k主题。然后我将检查每个小组成员,将小组过滤到只有那些在某些时候有紧急记录的人。最后,我将找到最新的音符,它是2级,3级,4级或5级...如果它是2,则返回它,因为这意味着它有一个未解决的音符。否则,丢弃它。
有什么想法吗?
编辑:我相信我找到了解决方案......
SELECT *, MAX(note_date) AS recent FROM ace_rp_notes n
LEFT JOIN ace_rp_orders o
ON n.order_id = o.id
WHERE n.urgency_id IN (2,3,4,5)
GROUP BY order_id
HAVING urgency_id = 2
AND recent = n.note_date
根本没有时间。
答案 0 :(得分:0)
我采取以下方法:
SELECT n.*
FROM ace_rp_notes AS n
INNER JOIN (
SELECT order_id, max(note_date) as maxdate
FROM ace_rp_notes
GROUP BY order_id
HAVING urgency_id = 2
) AS md
ON n.order_id = md.order_id
AND n.note_date = md.maxdate
子查询获取每个主题的最后一个注释,然后将其与注释连接以获得最后一张票的紧急程度,然后过滤2以有效地要求关于主题的最后一个注释是紧急性2来限定记录在SELECT中。
编辑:使用子查询中的HAVING进行优化,而不是在子查询中进行优化。