当前位置: 首页 > 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. 关联子查询EXISTSgo复制// 查询有订单的用户 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.rkmt.cn/news/1310790.html

相关文章:

  • Houdini-URP-风格化树木:从模型到Shader的全流程实战
  • 北京金发钹祥金属材料贸易:口碑好的北京不锈钢刨槽厂家推荐 - LYL仔仔
  • NVMe SSD的“午睡”与“秒醒”:深入解读PS3/PS4低功耗状态的实现与代价
  • 技能树工具haru-skills:结构化学习路径规划与知识管理实践
  • 企业微信消息监听实战:如何实时接收客户消息回调?
  • K210数字识别数据集采集的两种实用方法:串口定时与按键触发,哪种更适合你的电赛项目?
  • 应对claudecode封号与token不足的taotoken平滑迁移方案
  • 049二叉树的最近公共祖先
  • Space Thumbnails:Windows资源管理器的终极3D模型预览解决方案
  • 第19章:Rules Engineering实战案例集
  • 保姆级教程:手把手教你用Verilog实现OpenOFDM的equalizer.v模块(子载波均衡+导频校正)
  • 解锁专业直播节奏:OBS Advanced Timer计时器插件终极指南
  • Hi3516开发板OpenHarmony标准系统环境搭建与编译烧录全攻略
  • 汽车电子架构演进:从域控制器到中央计算,解析MEB平台的软件定义汽车之路
  • 保姆级教程:用Swin Transformer骨干网在DINO上训练你的第一个自定义数据集(附环境配置避坑指南)
  • 蓝桥杯嵌入式:从零到一的考场环境搭建与避坑指南
  • 在Windows上安装APK的终极指南:5步掌握APK Installer工具
  • 从数据驱动到物理约束:盘点神经网络求解偏微分方程的三大范式与核心进展
  • SMARC嵌入式模块规范解析:从标准化接口到硬件设计实战
  • 别再只用熵权法了!用Python手把手教你实现CRITIC权重法(附完整代码与客户评分案例)
  • 开发 AI Agent 应用时如何利用 Taotoken 灵活调度不同模型执行子任务
  • 量子机器学习QPIE架构解析与工程实践
  • 5分钟掌握ROFL播放器:英雄联盟回放文件终极查看器完整指南
  • 告别机械抖动!用C语言在GRBL中实现直线路径的平滑圆弧过渡(附完整代码)
  • 别再只会用HX711了!用ADC0832和51单片机做电子秤,精度校准与误差分析实战
  • 徐州恒冠矿山机械:性价比高的苏州滚圈轮带哪家好 - LYL仔仔
  • 石家庄的姐妹别被忽悠了!所谓的“纯银”首饰,其实成本只要这个数? - 奢侈品回收测评
  • 从SolidWorks到Adams:除了Parasolid,你的模型导入后为什么动不起来?(深度解析PSMAR与接触力设置)
  • DDR4信号完整性仿真实战:从模型提取到时域波形分析
  • 企业内网系统安全集成AI能力时Taotoken的APIKey管理与审计价值