首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左连接如何使用sqlx

左连接如何使用sqlx
EN

Stack Overflow用户
提问于 2018-10-03 15:19:31
回答 3查看 3.3K关注 0票数 1

我正在尝试用一个简单的查询来连接两个表personprofile,这个查询看起来在mysql中工作得很好,但在sqlx中就不行了。这是我的go代码:

代码语言:javascript
复制
package main 

import (
    "fmt"
    "github.com/jmoiron/sqlx"
    _ "github.com/go-sql-driver/mysql"
)

type Person struct {
    Id      int64   `db:"id"`
    Name    string  `db:"name"`
    Email   string  `db:"email"`
}

type Profile struct {
    Id          int64   `db:"id"`
    Face        string  `db:"face"`
    Hair        string  `db:"hair"`
    Person
}

func main() {
    DB, err := sqlx.Connect("mysql", "root:hackinitiator@/dusk")
    if err == nil {
        fmt.Println("sucess!!")
    } 
    var q []Profile
    DB.Select(&q, "select person.id, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
    fmt.Println(q)
}

mysql查询生成以下输出:

代码语言:javascript
复制
+------+------+---------+----+----------+--------+
| id   | name | email   | id | face     | hair   |
+------+------+---------+----+----------+--------+
|    1 | yoda | nomail  |  1 | round    | brown  |
|    5 | han  | nomail1 |  3 | circle   | red    |
|    6 | yun  | nomail2 |  4 | triangle | yellow |
|    7 | chi  | nomail3 |  5 | square   | green  |
+------+------+---------+----+----------+--------+

这是非常好的,但是我的go程序没有像预期的那样响应。该结构无法捕获配置文件id (输出中为空),person id被替换为配置文件id。以下是输出(已格式化):

代码语言:javascript
复制
[
{0 round brown {1 yoda nomail}} 
{0 circle red {3 han nomail1}} 
{0 triangle yellow {4 yun nomail2}} 
{0 square green {5 chi nomail3}}
]

我不知道哪里出了问题。

EN

回答 3

Stack Overflow用户

发布于 2018-10-04 21:02:58

按照@zerkms提供的代码片段,我做了一些修改,这样我就可以运行程序而不会出错,也不会重命名db标签。首先,我在profile struct中添加了以下代码,以便让查询识别person结构

代码语言:javascript
复制
Person `db:"person"`

之后,我将SQL查询字符串更改为以下代码

代码语言:javascript
复制
DB.Select(&q, `select person.id "person.id", person.name "person.name", person.email "person.email", profile.* from profile left join person on person.id = profile.person_id`)

避免@zerkms指出的重复列名称

票数 1
EN

Stack Overflow用户

发布于 2018-10-03 19:10:19

你需要像下面描述的那样在person结构中更改db名称,因为将有两个同名的列,即id,所以它只扫描profile表中的最后一个id,而不扫描person表,所以遵循下面提到的结构。

代码语言:javascript
复制
type Person struct {
    Id      int64   `db:"pId"`
    Name    string  `db:"name"`
    Email   string  `db:"email"`
}

然后使用person.idas编写查询,如下所示

代码语言:javascript
复制
DB.Select(&q, "select (person.id) as pId, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
票数 0
EN

Stack Overflow用户

发布于 2018-10-03 19:11:02

该错误是由于从结果中返回了两个id列,但将结果存储在两个结构中具有相同字段名id的结构中,您正在将其实例传递给DB.Select。尝试捕获单个id列并将其传递给struct。

传递多个列,但列名不同,可以用作别名。列别名将是Person结构中的字段,您将在其中扫描数据,如下所示:

代码语言:javascript
复制
type Person struct {
    PersonId    int64   `db:"personId"`
    Name        string  `db:"name"`
    Email       string  `db:"email"`
}

var q []Profile
DB.Select(&q, "select person.id as personId, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
fmt.Println(q)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52621745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档