亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang SQL 表 JOIN 到切片字段

Golang SQL 表 JOIN 到切片字段

Go
慕運維8079593 2023-08-14 17:33:23
考慮下表CREATE TABLE foo (  id INT PRIMARY KEY)CREATE TABLE bar (  id INT PRIMARY KEY)CREATE TABLE foo_bar_members (  foo_id INT NOT NULL REFERENCES foo(id) ON DELETE CASCADE ON UPDATE CASCADE,  bar_id INT NOT NULL REFERENCES bar(id) ON DELETE CASCADE ON UPDATE CASCADE,  PRIMARY KEY (foo_id, bar_id))foo_bar_membersfoo是連接和的關系表bar。查看foo作為 的父級bar。我有以下 Go 結構:type Foo struct {  ID     int `db:"id"`  BarIDs []int}BarIDs是與bar.id此相關聯的一部分。我想查詢這樣的事情:foofoo.idSELECT * FROM foo f INNER JOIN foo_bar_members fbm ON f.id = fbm.foo_id WHERE f.id = $1但這個查詢只是一個例子。顯然這不會掃描到Foo.BarIDs. 我總是可以做兩個單獨的查詢,但我想知道是否有更好的方法。我正在使用sqlx。
查看完整描述

1 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

SQL,這里的左連接也將返回沒有關聯的 bar 的 foos。


select

    foo.id

    , array_agg(bar.id)

from foo

left join foo_bar_members m on m.foo_id = foo.id

where foo.id = $1

group by foo.id

如果您只關心有 bar 的 foo,那么實際上不需要連接。


select

    m.foo_id

    , array_agg(m.bar_id)

from foo_bar_members m

where m.foo_id = $1

group by m.foo_id

執行代碼:


const sql = "<one of the queries from above>"


f := new(Foo)

if err := db.QueryRow(sql, 123).Scan(&f.ID, pq.Array(&f.BarIDs)); err != nil {

    return err

}

pq.Array是一個返回實現sql.Scanner和driver.Valuer接口的值的函數,并且該實現知道如何將 postgres 數組掃描到 go 切片中或將 go 切片轉換為 postgres 數組。


我不熟悉,所以它本身可能提供了一些允許您掃描數組的功能,因此可能沒有必要sqlx使用。pq.Array也許更了解的人最終會提供他們的解決方案版本。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號