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

如何使用Go BUN库对一对多关系执行内连接查询?

问题:如何通过Bun ORM实现关联内连接,排除无符合条件关联数据的TableA记录

模型定义

type TableA struct {
    ID      int
    Name    string
    TableBs []*TableB `bun:"rel:has-many,join:id=table_aid"`
}

type TableB struct {
    ID       int
    TableAID int
    Num      int
}

当前使用以下查询时,会返回TableBs字段为nil的TableA元素,无法排除这类没有匹配关联数据的记录:

db.NewSelect().Model(tableA).Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery {
    return q.Where("num = 1")
})

解决方案

可以通过两种方式实现内连接效果,排除无符合条件TableB的TableA:

1. 在关联查询中指定内连接类型

Bun默认对has-many关联使用左外连接,只需在Relation方法中添加bun.JoinInner()选项,即可强制使用内连接:

db.NewSelect().Model(&tableA).
    Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery {
        return q.Where("num = 1")
    }, bun.JoinInner())

2. 使用EXISTS子查询过滤

通过子查询判断当前TableA是否存在符合条件的TableB,再结合关联查询获取匹配的关联数据:

db.NewSelect().Model(&tableA).
    Where("EXISTS (SELECT 1 FROM table_bs WHERE table_bs.table_aid = table_as.id AND table_bs.num = 1)").
    Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery {
        return q.Where("num = 1")
    })

两种方式都能达到目标:只返回存在num=1的TableB关联数据的TableA记录。


内容的提问来源于stack exchange,提问作者Nelson Rivera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:33:14