如何在Golang的gorm中执行嵌套查询

huangapple go评论125阅读模式
英文:

How to execute nested query in golang gorm

问题

我想在Golang的gorm中执行以下查询:

  1. select * from MY_TABLE where MY_FIELD in (select max(MY_FIELD) as MY_FIELD from MY_TABLE group by ANOTHER_FIELD)

除了使用原始查询(raw query),gorm还有其他的方法吗?

英文:

I want to execute a query like below in golang gorm:

  1. select * from MY_TABLE where MY_FIELD in (select max(MY_FIELD) as MY_FIELD from MY_TABLE group by ANOTHER_FIELD)

Is there a way besides raw query in gorm?

答案1

得分: 4

你可以通过构建查询来实现这一点。看看这个例子:

  1. func FindProspects(categories *string, cities *string, hasEmail *bool, hasContactperson *bool, limit int64, offset int64) []*gModels.Prospect {
  2. var prospects []*gModels.Prospect
  3. query := env.DB().Table("prospects").Select("prospects.id, prospects.name")
  4. if categories != nil {
  5. query = query.Joins("JOIN prospect_categories ON prospect_categories.prospect_id = prospects.id").Where("prospect_categories.category_name IN (?)", strings.Split(*categories, ","))
  6. }
  7. if cities != nil {
  8. query = query.Where("prospects.city IN (?)", strings.Split(*cities, ","))
  9. }
  10. if hasEmail != nil && *hasEmail == true {
  11. query = query.Where("prospects.id IN (SELECT emails.prospect_id FROM emails WHERE emails.prospect_id = prospects.id)")
  12. }
  13. if hasContactperson != nil && *hasContactperson == true {
  14. query = query.Where("prospects.id IN (SELECT contact_people.prospect_id FROM contact_people WHERE contact_people.prospect_id = prospects.id)")
  15. }
  16. query = query.Order("prospects.name ASC")
  17. query.Limit(int(limit)).Offset(int(offset)).Find(&prospects)
  18. return prospects
  19. }

希望对你有所帮助。

英文:

You can do this by building up your query. Check out this example:

  1. func FindProspects(categories *string, cities *string, hasEmail *bool, hasContactperson *bool, limit int64, offset int64) []*gModels.Prospect {
  2. var prospects []*gModels.Prospect
  3. query := env.DB().Table("prospects").Select("prospects.id, prospects.name")
  4. if categories != nil {
  5. query = query.Joins("JOIN prospect_categories ON prospect_categories.prospect_id = prospects.id").Where("prospect_categories.category_name IN (?)", strings.Split(*categories, ","))
  6. }
  7. if cities != nil {
  8. query = query.Where("prospects.city IN (?)", strings.Split(*cities, ","))
  9. }
  10. if hasEmail != nil && *hasEmail == true {
  11. query = query.Where("prospects.id IN (SELECT emails.prospect_id FROM emails WHERE emails.prospect_id = prospects.id)")
  12. }
  13. if hasContactperson != nil && *hasContactperson == true {
  14. query = query.Where("prospects.id IN (SELECT contact_people.prospect_id FROM contact_people WHERE contact_people.prospect_id = prospects.id)")
  15. }
  16. query = query.Order("prospects.name ASC")
  17. query.Limit(int(limit)).Offset(int(offset)).Find(&prospects)
  18. return prospects
  19. }

Hope this helps.

答案2

得分: 0

你可以构建原始查询:

  1. subQuery := db.Model(Table_Name).Select(field).Group(field).QueryExpr()
  2. err := db.Model(TableName).Scan(outPutStructArray).Where("myfiled IN (?)", subQuery).Error

并适当处理错误。

英文:

you can build raw queries

  1. subQuery := db.Model(Table_Name).Select(field).Group(field).QueryExpr()
  2. err := db.Model(TableName).Scan(outPutStructArray).Where("myfiled IN (?)", subQuery).Error

and handle error appropriately

huangapple
  • 本文由 发表于 2016年12月28日 17:10:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/41358756.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定