Mysql查询以获取一对多关系并扫描到结构

标签 mysql sql go

我有 2 张 table

person {
  id
} 

email {
  email 
  person_id
}
其中人员和电子邮件具有一对多的关系。
我有 Go 结构
type Person struct {
  ID string
  Emails []*string
}
我想进行 1 次查询并扫描到 Person在数组中包含电子邮件的结构。
rows, _ := db.QueryContext(ctx, statement, ...)

people := []*Person{}

for rows.Next() {
  var person *Person
  rows.Scan(&person.ID, &person.Emails) // this can change as needed
  people = append(people, person)
}
return people
为了实现这一目标,查询将是什么? Go 代码还有什么需要改变的?

最佳答案

这实际上是更多的 SQL 问题。在 SQL 端有几种方法可以做你想做的事,在 Go 端有几种方法可以做到。
在 SQL 方面,也许你会做一个 JOIN在两个表上(或者如果您使用外键或其他一些约束,只需 SELECT email 表)并在 Go 中对数据进行排序。另一种选择是执行多个查询(可能使用准备好的语句)。

type Person struct {
  ID string
  Emails []string // doesn't need to be a pointer to a string
}

rows, _ := db.Query(`SELECT person.id, email.email FROM person JOIN email ON person.id = email.person_id`)
peopleMap := make(map[int]*Person)

for rows.Next() {
    p := struct{ID int, Email string}{} // anonymous temporary struct
    rows.Scan(&p.ID, &p.Email)
    
    if !peopleMap[p.ID] { // check if person has been added to map yet
      peopleMap[p.ID] = &Person{ID: p.ID, Emails: make([]string, 0, 1)}
    }
    peopleMap[p.ID].Emails = append(peopleMap[p.ID].Emails, p.Email)
}

// then either use the map directly or convert it to an array.

另一种选择是为每个人执行一个新查询,以便在结果集中只获取他们的电子邮件。

关于Mysql查询以获取一对多关系并扫描到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63162343/

相关文章:

github - 安装 cf-console 返回错误

php - undefined index 错误 - 图片上传相同的代码正在处理另一个示例

MySQL类引擎: short list of usernames who have liked post design

php - mysql - 在表 2 上删除特定行时在表 1 中插入行

mysql - 没有子查询的sql查询

sql - 另一种百分位数方法?

sorting - 按字母顺序获取 map 中的键的简单方法

go - 是否有Go http方法将整个http响应转换为 byte slice ?

php - 将 SQL 语句从 USING 重写为 ON

mysql - 具有复杂 'if/else' 要求的 SQL SELECT 语句