如何将JOIN映射到具有子结构数组的结构数组

时间:2016-06-23 18:57:06

标签: arrays go struct sqlx

我的数据库中有两个表,<span id="test">Change this text without removing <span>what's in the span</span></span> <button>Do It</button>tags

record_tag

tags
----
id
name

我有这两种结构:

record_tag
----------
id
record_id
tag_id
...
tag_owner (user_id)

目前,我有这个循环执行type Tag struct { Id int `json:"id" db:"id"` Tag_owner string `json:"tag_owner" db:"tag_owner"` Tag_id int `json:"tag_id" db:"tag_id"` Record_id string `json:"record_id" db:"record_id"` Record_type string `json:"record_type" db:"record_type"` Record_kind string `json:"record_kind" db:"record_kind"` Text string `json:"text" db:"name"` Meta string `json:"meta" db:"meta"` } type TaggedRecord struct { Record_id string `json:"record_id" db:"record_id"` Tags []Tag `json:"tags" db:"tag_id"` } sqlx次呼叫:

n

当我将taggedRecords := []TaggedRecord{} for _, record := range body.Records { tags := []Tag{} _ = db.Select(&tags, "SELECT r.id,r.tag_owner,r.record_id,r.tag_id,r.record_type,r.meta,r.record_kind,t.name FROM record_tag r, tags t WHERE r.tag_owner = $1 AND r.record_id = $2 AND r.tag_id = t.id", body.User, record) taggedRecord := TaggedRecord{Record_id: record, Tags: tags} taggedRecords = append(taggedRecords, taggedRecord) } 编入JSON时,我得到了所需的输出:

taggedRecords

显然,这是虚拟数据。上述实现有效,但我不喜欢这样,因为通常[ { "record_id": "dfwref3f", "tags": [] }, { "record_id": "3lkgekrljdkjfkjekjkjker", "tags": [ { "id": 6, "tag_owner": "p0stman", "tag_id": 2, "record_id": "3lkgekrljdkjfkjekjkjker", "record_type": "candidate", "record_kind": "candidate", "text": "lol", "meta": "{\"name\": \"exxon mobile\"}" }, { "id": 7, "tag_owner": "p0stman", "tag_id": 3, "record_id": "3lkgekrljdkjfkjekjkjker", "record_type": "candidate", "record_kind": "candidate", "text": "df", "meta": "{\"name\": \"exxon mobile\"}" } ] } ] 将为10,并且10个单独的网络调用数据库。我已经戳了一下,尝试了一些事情......我觉得应该可以将它作为一个查询。我尝试过实现this解决方案,但它对我不起作用,因为我的根结构嵌入了一个子结构的数组,而不仅仅是一个子结构。

我试过这个:

n

taggedRecords := []TaggedRecord{} var s string for _, record := range body.Records { s = s + "r.record_id = '" + record + "' OR " } s = s[:len(s)-4] _ := db.Select(&taggedRecords, "SELECT r.id,r.tag_owner,r.record_id,r.tag_id,r.record_type,r.meta,r.record_kind,t.name,t.id FROM record_tag r, tags t WHERE r.tag_owner = $1 AND "+s+" AND r.tag_id = t.id", body.User) 会发出一条错误消息,指出无法找到目标名称ID,我认为这是因为有两个id字段,它无法正确地将连接映射到两个结构上( Select语法似乎不支持点表示表名或昵称),或两者兼而有之。

是否有可能/什么是实现此SQL调用的最佳方式,并在减少数据库调用的同时编组为上述输出格式?

1 个答案:

答案 0 :(得分:0)

您可以使用IN表达式选择整个销售的一堆标签 将它们分配给Go中的各自所有者。

  WHERE some_id IN(1,2,3,4)

你可以迭代一组id来构建它

或者您可以使用SQL别名

来避免模糊查询
 SELECT t.id , r.id as r_id 

并以多种方式区分Go中的这些列(向结构添加一列,使用sqlx结构标记......)