如何将含字段子查询的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
相关产品推荐
相关产品推荐

