gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:21:30 28 4
gpt4 key购买 nike

我有 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com