Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 调查结果;“未答复”;评论_Mysql_Sql - Fatal编程技术网

Mysql 调查结果;“未答复”;评论

Mysql 调查结果;“未答复”;评论,mysql,sql,Mysql,Sql,我正在处理一个设计糟糕的表,无法找到更快的查询。当前查询由上一个开发人员编写,运行需要20秒 有18k条记录被称为“注释”,有主题id、日期和紧急级别。我需要所有被认为“紧急”的记录。要使便笺成为紧急便笺,其紧急级别必须为2。但是,如果自最近的2级注释以来,同一主题有3级、4级或5级注释,则该注释被视为不紧急。换句话说,当一个主题得到2级注释时,它被认为是紧急的,直到它得到3级、4级或5级注释为止。如果它收到另一个通知,它再次被认为是紧急的 我需要得到所有的紧急通知。在我的脑海里,是这样的:

我正在处理一个设计糟糕的表,无法找到更快的查询。当前查询由上一个开发人员编写,运行需要20秒

有18k条记录被称为“注释”,有主题id、日期和紧急级别。我需要所有被认为“紧急”的记录。要使便笺成为紧急便笺,其紧急级别必须为2。但是,如果自最近的2级注释以来,同一主题有3级、4级或5级注释,则该注释被视为不紧急。换句话说,当一个主题得到2级注释时,它被认为是紧急的,直到它得到3级、4级或5级注释为止。如果它收到另一个通知,它再次被认为是紧急的

我需要得到所有的紧急通知。在我的脑海里,是这样的:

  • 按注释的顺序\u 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

这根本不需要时间。

我会采取以下方法:

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中的条件


编辑:在子查询中而不是在子查询之外进行优化。

您可以将当前查询添加到问题中吗?当您提到注释时,您指的是主题吗?因为在注释表中,每个记录理论上都应该是注释。因此,我想你的意思是你想找到一个紧急主题,而当一个主题的最新注释为2级时,该主题是紧急的?我们可以这样总结:“返回所有注释,其中最新注释的
紧迫性id
为2,后面没有
紧迫性id
为3、4或5。”?在我打字时,不公平地解决这个问题!)不过,您应该添加您的解决方案作为答案。这不是问题,绝对是。措辞得体。默多克,你说得对,但我确实想返回紧急通知,而不是urgen主题。这个查询花了1.5秒,我的花了1.1秒。我认为主要的区别在于,您在内部连接两个大表,而我只需要在找到每个组的最新注释后过滤表。好的一点是,如果我在子查询中使用内部连接,则内部连接只需要与相关记录连接。我会修改它,让你有一个答案可以接受。这实际上似乎不起作用。最后我写了一些紧急的笔记。。。查询应仅返回紧急程度为2的注释,即未解决的紧急注释。