按最大日期分组

我在执行这段代码时遇到了问题:

SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
FROM tblpm GROUP BY control_number
HAVING control_number=n.control_number)

基本上,我想返回每个控件号的最近日期。上面的查询返回正确的输出,但需要37秒。在显示输出之前。

是否有其他 sql 子句或命令可以比上面的查询执行得更快?

先谢谢你。

205726 次浏览

没有必要在那个子查询中进行分组... where 子句就足够了:

SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
FROM tblpm WHERE control_number=n.control_number)

另外,“ date _ update”列上是否有索引? 这肯定会有帮助。

将子查询放在 WHERE 子句中并将其限制为 n.control _ number 意味着它将多次运行子查询。这就是所谓的 相关子查询,它通常是一个性能杀手。

最好在 FROM 子句中运行一次子查询,以获得每个控件号的最大日期。

SELECT n.*
FROM tblpm n
INNER JOIN (
SELECT control_number, MAX(date_updated) AS date_updated
FROM tblpm GROUP BY control_number
) AS max USING (control_number, date_updated);

拥有:

SELECT * FROM tblpm n
FROM tblpm GROUP BY control_number
HAVING date_updated=MAX(date_updated);

HAVING的上下文中,MAX找到每个组的最大值。只有每组中的最新条目才能满足 date_updated=max(date_updated)。如果在一个组中有一个关联的最新值,那么它们都将通过 HAVING过滤器,但是 GROUP BY意味着只有一个会出现在返回的表中。

另一种不使用 group by 的方法是:

SELECT * FROM tblpm n
WHERE date_updated=(SELECT date_updated FROM tblpm n
ORDER BY date_updated desc LIMIT 1)