使用 gorm .Joins 时使用 INNER JOIN 而不是 LEFT JOIN

问题描述 投票:0回答:1

我有以下结构:

type User struct {
     ID   uuid.UUID `gorm:"type:uuid"` 
     BirthDate *BirthDate `gorm:"<-"`
     BirthDateID uuid.UUID  
}

type BirthDate struct {
    ID   uuid.UUID `gorm:"type:uuid"` 
    Year int
    Month int
    Day int
}

(这些是组成结构)。所以基本上用户和出生日期之间存在一对一的关系,我们假设两个用户不能在同一天出生。

我希望能够检索2022年出生的所有用户,所以我有以下内容:

var result []*User
birthDateExample := BirthDate{Year:2022}
DB.Debug().Joins("BirthDate", s.Database.Select("id").Where(birthDateExample)).Preload(clause.Associations).Find(&result)

但是它正在进行左连接查询,所以我得到了更多我想要的结果:

SELECT `users`.`id`,`users`.`birth_date_id`,`BirthDate`.`id` AS `BirthDate__id`,`BirthDate`.`year` AS `BirthDate__year`,`BirthDate`.`month` AS `BirthDate__month`,`BirthDate`.`day` AS `BirthDate__day` FROM `reports` LEFT JOIN `birth_dates` `BirthDate` ON `users`.`birth_date_id` = `BirthDate`.`id` AND `BirthDate`.`year` = "2022"

如何指定我想要内部联接?因为如果我将查询编写为以下内容,它就会起作用:

DB.Debug().Joins("JOIN birth_dates on birth_dates.id = users.billing_month_id and birth_dates.year = ?", 2022).Preload(clause.Associations).Find(&result)

但我宁愿使用以前的方法,Joins("BirthDates", query)。

join left-join inner-join go-gorm
1个回答
0
投票

Joins

行为
是执行 LEFT JOIN,无论出于何种原因。要获得内部联接,您可以使用
InnerJoins
方法:

DB.Debug()
  .InnerJoins("BirthDate", s.Database.Select("id").Where(birthDateExample))
  .Preload(clause.Associations)
  .Find(&result)
© www.soinside.com 2019 - 2024. All rights reserved.