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

7y4bm7vi  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(323)

我有两张table

  1. person {
  2. id
  3. }
  4. email {
  5. email
  6. person_id
  7. }

个人和电子邮件之间存在一对多关系。
我得走了

  1. type Person struct {
  2. ID string
  3. Emails []*string
  4. }

我想做一个查询并扫描到 Person 数组中包含电子邮件的结构。

  1. rows, _ := db.QueryContext(ctx, statement, ...)
  2. people := []*Person{}
  3. for rows.Next() {
  4. var person *Person
  5. rows.Scan(&person.ID, &person.Emails) // this can change as needed
  6. people = append(people, person)
  7. }
  8. return people

为了实现这一点,查询将是什么?围棋代码还有什么需要改变的?

pkbketx9

pkbketx91#

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

  1. type Person struct {
  2. ID string
  3. Emails []string // doesn't need to be a pointer to a string
  4. }
  5. rows, _ := db.Query(`SELECT person.id, email.email FROM person JOIN email ON person.id = email.person_id`)
  6. peopleMap := make(map[int]*Person)
  7. for rows.Next() {
  8. p := struct{ID int, Email string}{} // anonymous temporary struct
  9. rows.Scan(&p.ID, &p.Email)
  10. if !peopleMap[p.ID] { // check if person has been added to map yet
  11. peopleMap[p.ID] = &Person{ID: p.ID, Emails: make([]string, 0, 1)}
  12. }
  13. peopleMap[p.ID].Emails = append(peopleMap[p.ID].Emails, p.Email)
  14. }
  15. // then either use the map directly or convert it to an array.

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

展开查看全部

相关问题