GROUP BY具有MAX日期

时间:2013-08-14 01:54:50

标签: mysql sql optimization greatest-n-per-group

执行此代码时遇到问题:

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 个答案:

答案 0 :(得分:102)

将子查询放在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);

答案 1 :(得分:16)

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

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

另外,'date_updated'列上有索引吗?那肯定会有所帮助。

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-5)

通过HAVING快速轻松地完成:

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表示只有一个会出现在返回的表格中。