mysql group by 最后一条
时间: 2025-06-01 14:08:37 浏览: 13
### 如何在MySQL中使用GROUP BY获取每个分组的最后一条记录
在MySQL中,如果需要通过`GROUP BY`获取每个分组的最后一行数据,可以结合子查询和排序操作来实现。以下是具体方法:
1. **使用子查询与排序**
在子查询中对数据按照指定列(如时间戳或ID)进行降序排序,确保最新的记录排在前面。然后,在外部查询中使用`GROUP BY`来获取每组的第一条记录(即排序后的最后一条记录)。例如,以下SQL语句展示了如何获取每个分组的最后一行数据[^1]:
```sql
SELECT t.*
FROM (
SELECT *
FROM message_detail
ORDER BY id DESC
) t
WHERE t.company_id = 1
GROUP BY t.message_kind_code;
```
2. **使用`MAX()`函数与连接**
另一种方法是利用`MAX()`函数找到每组的最大值(如时间戳或ID),然后通过连接(JOIN)获取对应的整行数据。这种方法适用于需要获取完整行信息的场景[^3]。示例如下:
```sql
SELECT t1.event_id, t1.create_time
FROM monitor_company_event t1
INNER JOIN (
SELECT company_name, row_key, event_subType, MAX(create_time) AS max_time
FROM monitor_company_event
GROUP BY company_name, row_key, event_subType
) t2
ON t1.company_name = t2.company_name
AND t1.row_key = t2.row_key
AND t1.event_subType = t2.event_subType
AND t1.create_time = t2.max_time;
```
3. **解决高版本MySQL中的限制**
在MySQL 5.7及以上版本中,默认启用了`ONLY_FULL_GROUP_BY`模式,这会阻止非聚合字段出现在`SELECT`列表中。因此,如果直接使用`GROUP BY`可能会报错。为了解决这一问题,可以通过修改SQL模式或使用上述方法中的子查询来规避此限制[^4]。
4. **注意事项**
- 默认情况下,`GROUP BY`返回的是每组的第一个记录,但这个记录不一定是最新的。因此,必须显式地进行排序以确保结果正确[^1]。
- 如果需要获取每个分组中大于一条数据的最新记录,可以结合`HAVING COUNT(*) > 1`条件[^2]。
### 示例代码
以下是一个综合示例,展示如何获取每个分组的最后一条记录:
```sql
SELECT t.*
FROM (
SELECT *
FROM test
ORDER BY test_id DESC
) t
GROUP BY t.test_user_id;
```
阅读全文
相关推荐


















