GROUP BY具有MAX日期

J-J*_*J-J 53 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)
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Bil*_*win 117

将子查询放在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);
Run Code Online (Sandbox Code Playgroud)

  • 任何想知道 `USING` 是做什么的人,它只是将列与 `ON` 配对 - 所以在这个例子中,片段 `USING (control_number, date_updated)` 等价于 `ON max.control_number = n.control_number AND max.date_updated = n.date_updated`。当使用像 Zend 这样的框架时,这是一个很好的知识,它使用后一种格式而不是前一种格式。 (9认同)
  • mysql doc - > http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html (5认同)
  • 你的答案只有8票...应该对像你这样的percona db master烦恼;),谢谢你,你帮我解决了一年前左右的一个愚蠢的MySQL SP bug.像你这样的人使Stack Overflow成为计算机书呆子的最佳资源. (3认同)
  • @PacketTracer,谢谢你的赞美,积分很有趣,但我更关心的是帮助人们获得好的答案并获得更大的成功.此外,到目前为止,这个问题已被观看超过9,300次.我想即使他们没有花时间给予投票,我也可能帮助了很多人. (3认同)
  • 我将此查询与我自己的表和列一起使用,但 mysql 说:“from 子句”中的未知列“date_updated”知道为什么吗? (2认同)

Mic*_*ahn 19

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

SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
    FROM tblpm WHERE control_number=n.control_number)
Run Code Online (Sandbox Code Playgroud)

另外,你有'date_updated'列的索引吗?那肯定会有所帮助.

  • 如果更新的日期相同(平局),则在使用此解决方案时会显示两个记录,因此您必须添加`GROUP BY n.control_number` (7认同)
  • 如果您需要性能,请不要使用此技术,请阅读 Bill 答案 (2认同)