使用GROUP BY分组后取出各组的最大值记录

  根据一般思路我们的做法是先用GROUP BY分组,再用SELECT MAX(`字段名`)取出最大值记录,但这种思路是错误的,正确写法如下:

SELECT
  `A`.`*`
FROM
  `tablename` AS `A`,
  (
    SELECT
      `code`,
      MAX(`date`) AS `max_date`
    FROM
      `tablename`
    GROUP BY
      `code`
  ) AS `B`
WHERE
    `A`.`code` = `B`.`code`
  AND `A`.`date` = `B`.`max_date`;

  上面的SQL就是将所有记录按code分组,再取出各组记录里面date最大的一条。

  为什么GROUP BY结合MAX()不能筛选出正确的记录呢?原因就在于GROUP BY之后默认是返回各组的第一条记录,这时可能有人会想能不能先用ORDER BY排序再用GROUP BY分组,很遗憾这是不行的,因为先ORDER BY再GROUP BY是错误的语法。

Copyright © 2024 码农人生. All Rights Reserved