You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()

关键修正点

  1. 子查询无需单独调用WithContext,主查询的上下文会自动传递
  2. 关联条件直接使用子查询的别名gusers引用字段,避免别名冲突
  3. 简化子查询的链式调用结构,贴合GORM Gen的使用规范

内容的提问来源于stack exchange,提问作者Edgar Zhivaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:02:05