第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang SQL 表 JOIN 到切片字段

Golang SQL 表 JOIN 到切片字段

Go
慕運(yùn)維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是連接和的關(guān)系表bar。查看foo作為 的父級(jí)bar。我有以下 Go 結(jié)構(gòu):type Foo struct {  ID     int `db:"id"`  BarIDs []int}BarIDs是與bar.id此相關(guān)聯(lián)的一部分。我想查詢這樣的事情:foofoo.idSELECT * FROM foo f INNER JOIN foo_bar_members fbm ON f.id = fbm.foo_id WHERE f.id = $1但這個(gè)查詢只是一個(gè)例子。顯然這不會(huì)掃描到Foo.BarIDs. 我總是可以做兩個(gè)單獨(dú)的查詢,但我想知道是否有更好的方法。我正在使用sqlx。
查看完整描述

1 回答

?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊

SQL,這里的左連接也將返回沒有關(guān)聯(lián)的 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

如果您只關(guān)心有 bar 的 foo,那么實(shí)際上不需要連接。


select

    m.foo_id

    , array_agg(m.bar_id)

from foo_bar_members m

where m.foo_id = $1

group by m.foo_id

執(zhí)行代碼:


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是一個(gè)返回實(shí)現(xiàn)sql.Scanner和driver.Valuer接口的值的函數(shù),并且該實(shí)現(xiàn)知道如何將 postgres 數(shù)組掃描到 go 切片中或?qū)?go 切片轉(zhuǎn)換為 postgres 數(shù)組。


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


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 1 回答
  • 0 關(guān)注
  • 219 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)