如何使用GORM Gen查询每组中的最后一条记录?
使用GORM Gen实现筛选每个用户最新接受状态记录的查询
表结构
create table users { created_at datetime(3) status str username longtex }
需求说明
筛选出状态为"accepted"的记录中,每个username对应的最新创建的完整记录。
原生SQL写法
SELECT users.* FROM users INNER JOIN ( SELECT username, MAX(created_at) as latest FROM users WHERE status = "accepted" GROUP BY username) gusers ON users.username = gusers.username AND users.created_at = gusers.latest
用户尝试的错误代码
q := query.Use(d.db) u := q.User lau := u.As("last_accepted_users") lauCreatedAtMax := lau.CreatedAt.Max().As("max_date") all, err := u.WithContext(ctx). Join(lau.WithContext(ctx). Select(lau.Username, lauCreatedAtMax). Where(lau.Status.Eq(model.FormStatusAccepted)). Group(lau.Username), u.Username.EqCol(lau.Username), u.CreatedAt.EqCol(lauCreatedAtMax), ).Find()
正确的实现方式
问题出在子查询的调用逻辑和关联条件的引用方式上,修正后的代码如下:
q := query.Use(d.db) u := q.User // 定义子查询别名 subQuery := u.As("gusers") // 构造子查询:获取每个username的最新创建时间 sub := subQuery.Select(subQuery.Username, subQuery.CreatedAt.Max().As("latest")). Where(subQuery.Status.Eq(model.FormStatusAccepted)). Group(subQuery.Username) // 主查询关联子查询,获取完整记录 all, err := u.WithContext(ctx). Join(sub, u.Username.EqCol("gusers.username"), u.CreatedAt.EqCol("gusers.latest") ).Find()
关键修正点
- 子查询无需单独调用
WithContext,主查询的上下文会自动传递 - 关联条件直接使用子查询的别名
gusers引用字段,避免别名冲突 - 简化子查询的链式调用结构,贴合GORM Gen的使用规范
内容的提问来源于stack exchange,提问作者Edgar Zhivaev
相关产品推荐
相关产品推荐

