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

如何将含字段子查询的SQL转换为Gorm查询?

对应Gorm查询实现方式

针对你提供的SQL语句,有两种常用的Gorm实现方式:

1. 直接使用原生SQL

这种方式适合直接复用现有SQL语句,代码直观:

首先确保你已经定义了匹配数据库表结构的模型结构体:

type User struct {
    ID                uint      `gorm:"column:id"`
    LastUpdateLogin   time.Time `gorm:"column:last_update_login"`
}

func (User) TableName() string {
    return "user"
}

然后执行原生SQL查询:

var users []User
db.Raw(`select a.id, 
  (
    select max(b.last_update_login) 
    from login_history b 
    where b.user_id = a.id  
  ) last_update_login
from user a`).Scan(&users)

2. 使用Gorm查询构造器

这种方式更贴合ORM风格,便于后续动态调整查询条件:

先定义对应表的模型结构体:

type LoginHistory struct {
    UserID           uint      `gorm:"column:user_id"`
    LastUpdateLogin  time.Time `gorm:"column:last_update_login"`
}

func (LoginHistory) TableName() string {
    return "login_history"
}

// User结构体同第一种方式
type User struct {
    ID                uint      `gorm:"column:id"`
    LastUpdateLogin   time.Time `gorm:"column:last_update_login"`
}

func (User) TableName() string {
    return "user"
}

接着构造子查询并组合主查询:

// 构造子查询:获取每个用户的最大last_update_login
subQuery := db.Model(&LoginHistory{}).Select("max(last_update_login)").Where("user_id = user.id")

// 主查询:关联子查询并返回结果
var users []User
db.Model(&User{}).Select("id, (?) as last_update_login", subQuery).Scan(&users)

内容的提问来源于stack exchange,提问作者Jeffy Dwitra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:39:56