76

执行此代码时遇到问题:

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 子句或命令可以比上面的查询执行得更快?

提前致谢。

4

4 回答 4

160

将子查询放在 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);
于 2013-08-14T02:08:57.637 回答
24

无需在该子查询中分组...... where 子句就足够了:

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

另外,您在“date_updated”列上有索引吗?那肯定会有所帮助。

于 2013-08-14T02:03:00.467 回答
-1

不使用 group by 的另一种方式:

SELECT * FROM tblpm n 
  WHERE date_updated=(SELECT date_updated FROM tblpm n 
                        ORDER BY date_updated desc LIMIT 1)
于 2016-12-31T12:13:16.760 回答
-9

快速轻松地拥有:

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

在 的上下文中HAVINGMAX找到每个组的最大值。只有每组中的最新条目才能满足date_updated=max(date_updated). 如果一个组中的 latest 有一个并列,两者都将通过HAVING过滤器,但这GROUP BY意味着只有一个会出现在返回的表中。

于 2016-03-14T10:36:53.837 回答