当前位置: 首页 > news >正文

gorm subquery

ORM 子查询(Subquery)是处理复杂 SQL 查询的常见需求。以下是 GORM 中实现子查询的主要方式:

1. 基础子查询

使用*gorm.DB作为条件值,GORM 会自动生成子查询:

go

复制

// 查询订单金额大于平均订单金额的所有订单 db.Where("amount > (?)", db.Table("orders").Select("AVG(amount)")).Find(&orders) // 生成的 SQL: // SELECT * FROM orders WHERE amount > (SELECT AVG(amount) FROM orders);

2. 使用.QueryExpr()/.SubQuery()

显式标记子查询表达式:

go

复制

// 查询存在至少一个订单的用户 subQuery := db.Table("orders").Select("user_id").Where("status = ?", "paid") db.Where("id IN (?)", subQuery).Find(&users) // 或使用 SubQuery (GORM v2) subQuery := db.Table("orders").Select("user_id").Where("status = ?", "paid") db.Where("id IN (?)", subQuery.SubQuery()).Find(&users)

3. 关联子查询(EXISTS)

go

复制

// 查询有订单的用户 db.Where("EXISTS (?)", db.Table("orders").Select("1").Where("orders.user_id = users.id")).Find(&users) // 生成的 SQL: // SELECT * FROM users WHERE EXISTS ( // SELECT 1 FROM orders WHERE orders.user_id = users.id // );

4. FROM 子句中的子查询(派生表)

go

复制

// 查询每个用户的订单总金额,并筛选总额大于1000的 subQuery := db.Table("orders").Select("user_id, SUM(amount) as total").Group("user_id") db.Table("(?) as u", subQuery).Where("total > ?", 1000).Find(&results) // 或使用 Table 直接写 SQL db.Table("(?) as t", db.Table("orders").Select("*")).Find(&results)

5. SELECT 中的子查询

go

复制

// 查询用户,并附带订单数量 db.Select("*, (?) as order_count", db.Table("orders").Select("COUNT(*)").Where("orders.user_id = users.id")).Find(&users)

6. 使用 Scopes 封装复用

go

复制

func ActiveUsers(db *gorm.DB) *gorm.DB { return db.Where("status = ?", "active") } // 子查询复用 subQuery := db.Model(&User{}).Scopes(ActiveUsers).Select("id") db.Where("user_id IN (?)", subQuery).Find(&orders)

7. 复杂示例:多表关联子查询

go

复制

// 查询购买了指定分类商品的用户 subQuery := db.Table("order_items"). Select("DISTINCT order_id"). Joins("JOIN products ON products.id = order_items.product_id"). Where("products.category = ?", "electronics") db.Where("id IN (?)", db.Table("orders").Select("user_id").Where("id IN (?)", subQuery), ).Find(&users)

注意事项

表格

场景说明
参数绑定子查询中的参数会自动绑定,防止 SQL 注入
性能子查询可能性能较差,大数据量时考虑 JOIN 或临时表
别名派生表(FROM 子查询)必须指定别名
GORM 版本v1 和 v2 的 API 略有差异,v2 更推荐使用SubQuery()

如果你有具体的业务场景或遇到报错,可以提供代码,我可以帮你针对性地优化。

http://www.jsqmd.com/news/839770/

相关文章:

  • 浅析 GEO 全域优化落地实践,探词科技行业布局与生态合作现状 - 探词产品观测室
  • 2026年GEO优化服务商专业度与合规安全深度测评:如何科学甄别优质合作伙伴 - 博客湾
  • Taotoken Token Plan套餐带来的长期成本优势感知
  • 杭州治疗焦虑症医院排行:资质与疗效的客观盘点 - 奔跑123
  • 看看这家国内环境可靠性试验机构的测评,实力怎么样? - 资讯速览
  • CM211-1 MC022主板Armbian刷机避坑与长期稳定运行指南
  • 2026宁波婚纱摄影TOP榜单:真实口碑测评,高端定制首选哪家? - charlieruizvin
  • 2026年AI优化服务商TOP3权威测评:91.7%企业选错的真相与四层能力金字塔决策框架 - 博客湾
  • 5步掌握MoocDownloader:打造个人离线学习库的完整方案
  • 2026年厦门化妆品包装定制工厂选型指南:高端亚克力瓶与OEM/ODM代工全景评测 - 年度推荐企业名录
  • 无需分区!用VHD/VHDX在Windows中快速搭建双系统测试环境
  • PromptScript:用脚本引擎重构AI提示词开发,实现逻辑与业务解耦
  • 睿创燧石EX100 SE官宣上市,树立百元入门热像仪新标杆! - 资讯速览
  • 2026年5月聚焦泸州整装/全屋装修/新房装修/二手房装修/旧房翻新公司,揭秘领先服务商核心优势 - 2026年企业推荐榜
  • 别再只盯着地图了!聊聊电力GIS:从变电站里的‘钢铁侠战甲’到运维人的‘火眼金睛’
  • 2026年上海化妆品亚克力包装定制:高端日化包材供应商深度横评与选型避坑指南 - 年度推荐企业名录
  • 用大白话拆解memcmp:不止是字符串比较的利器
  • leijmdas godi goweb框架对标spring
  • Win11桌面图标突然锁死?别急着重装,试试这个隐藏的组策略修复法
  • 2026年江西省CPPM报考指南:证书颁发机构与官方授权报考机构全解析 - 众智商学院课程中心
  • 2026年浙江高端亚克力日化包装定制指南:5大源头工厂深度横评 - 年度推荐企业名录
  • KubeEdge云原生边缘计算平台:架构解析与部署实践
  • AI智能体技能库:模块化设计、核心技能解析与工程实践
  • YOLOv8改进避坑指南:手把手教你添加DCNv4和CSPStage,在GC10-DET上复现涨点结果
  • NotebookLM食品科研权限管理陷阱(97%团队未启用的审计日志功能已致3起数据溯源事故)
  • 如何高效批量下载微博相册:Python多线程下载终极指南
  • 2026市场核心关切:迈从头戴式耳机怎么样 | 多维度解析产品硬实力 - 资讯速览
  • Godot4 从零构建你的2D像素风平台跳跃游戏
  • NotebookLM赋能循证医学:如何72小时内完成文献综述初稿并自动生成参考文献链
  • 2026年宁波高端日化包装定制厂家深度选购指南:从亚克力瓶到OEM/ODM一站式解决方案 - 年度推荐企业名录