MySQL 分组取第一条记录通常是指在一个查询中,根据某个字段对数据进行分组,并从每个分组中获取第一条记录。这在处理聚合数据时非常有用,例如统计每个用户的最新活动记录。
常见的分组取第一条记录的方法有以下几种:
ROW_NUMBER()。JOIN 操作实现。GROUP_CONCAT 和 SUBSTRING_INDEX:通过字符串操作获取第一条记录。例如,假设我们有一个用户活动表 user_activity,包含以下字段:
id (主键)user_id (用户ID)activity_type (活动类型)activity_time (活动时间)我们希望获取每个用户的最新活动记录。
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY activity_time DESC) AS rn
FROM user_activity
) t
WHERE rn = 1;SELECT ua.*
FROM user_activity ua
JOIN (
SELECT user_id, MAX(activity_time) AS max_activity_time
FROM user_activity
GROUP BY user_id
) sub ON ua.user_id = sub.user_id AND ua.activity_time = sub.max_activity_time;GROUP_CONCAT 和 SUBSTRING_INDEXSELECT user_id,
SUBSTRING_INDEX(GROUP_CONCAT(activity_type ORDER BY activity_time DESC), ',', 1) AS latest_activity_type,
SUBSTRING_INDEX(GROUP_CONCAT(activity_time ORDER BY activity_time DESC), ',', 1) AS latest_activity_time
FROM user_activity
GROUP BY user_id;原因:MySQL 版本低于 8.0,不支持窗口函数。
解决方法:使用子查询或 GROUP_CONCAT 和 SUBSTRING_INDEX 方法。
原因:数据量过大导致查询效率低下。
解决方法:
user_id 和 activity_time 字段上有合适的索引。希望这些信息对你有所帮助!