Mysql group by 分组内排序
假设有一张评论表,记录 post 的每一条评论:
1 | CREATE TABLE `comments` ( |
1 | MariaDB [test]> select * from comments; |
需求:取得每一篇 post 的最后评论时间。根据上面的数据,用肉眼可以看出应该是 id 为 4 和 5 的记录。
1 | MariaDB [test]> select id, post_id, created from comments |
显然这个结果不对。原因是 Mysql 关键字的执行顺序 group by > order by,即先根据 post_id 分组,默认都取得第一笔资料,然后再根据 created 字段进行排序,所以得到上面的结果。
这里我们先假设 id 字段和 created 字段是一起增加的,即 id 越大,created 越新。
1 | MariaDB [test]> select id, post_id, created from comments c1 |
结果符合预期。
那么如果 id 和 created 不是一起增加的呢。假设以下数据:
1 | insert into `comments` values |
1 | MariaDB [test]> select * from comments; |
可以看出,符合结果的记录应该 id 为 1 和 5。
1 | MariaDB [zireael]> select id, post_id, created from comments c1 |
所以这个时候继续用 max(id) 来解决是不对的。
1 | MariaDB [zireael]> select c1.id, c1.post_id, c1.created from comments c1 |
这个时候的结果就对了。