找到“未答复”的评论

时间:2014-01-03 12:45:12

标签: mysql sql

我正在处理一个设计糟糕的表格,无法找出更快的查询。由前一个dev编写的当前查询需要20秒才能运行。

有18k记录称为“备注”,具有topic_id,日期和紧急程度。我需要所有被认为是“紧急”的记录。对于紧急情况的说明,它必须具有2的紧急程度。但是,如果由于最近的2级说明,有一个3级,4级或5级的说明,则说明不紧急。同一主题。换句话说,当主题获得2级音符时,它被认为是紧急的,直到它获得3级,4级或5级音符。如果它收到另一张纸条,则再次被认为是紧急的。

我需要获得所有紧急笔记。在我的脑海中,它是这样的:

  • 按照order_id对笔记进行分组。
  • 过滤掉任何没有紧急程度为2的笔记的群组。
  • 仅选择最近2级,3级,4级或5级注释的组 不是2。

据我所知,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

根本没有时间。

1 个答案:

答案 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进行优化,而不是在子查询中进行优化。