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

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

使用PostgreSQL / NodeJS將JOIN表作為結(jié)果數(shù)組獲取

使用PostgreSQL / NodeJS將JOIN表作為結(jié)果數(shù)組獲取

鴻蒙傳說(shuō) 2019-09-03 19:15:19
我正在創(chuàng)建一個(gè)用戶可以創(chuàng)建問(wèn)題的應(yīng)用程序,而其他人可以對(duì)其進(jìn)行upvote / downvote。以下是我的sql架構(gòu)的一部分:CREATE TABLE "questions" (  id            SERIAL,  content       VARCHAR(511) NOT NULL,  created_at    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),  CONSTRAINT    pk_question PRIMARY KEY (id));CREATE TABLE "votes" (  id            SERIAL,  value         INT,  question_id   INT NOT NULL,  CONSTRAINT    pk_vote PRIMARY KEY (id),  CONSTRAINT    fk_question_votes FOREIGN KEY (question_id) REFERENCES questions (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE);我想要的是Postgres給我的每個(gè)問(wèn)題都有一系列投票,像這樣:[{ // a question  id: 1,  content: 'huh?',  votes: [{ // a vote    id: 1,    value: 1  }, { // another vote    id: 2,    value: -1  }]}, { /*another question with votes*/ }]我查看了聚合函數(shù)(如array_agg()),但它只給了我一些值。一個(gè)JOIN給了我一個(gè)加上投票的問(wèn)題,并迫使我做服務(wù)器端操作,我不愿意這樣做。有沒(méi)有辦法做到這一點(diǎn)?關(guān)于我想弄錯(cuò)的是什么原因?謝謝你的時(shí)間。
查看完整描述

3 回答

?
慕虎7371278

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

pg-promise很容易做到這一點(diǎn):


function buildTree(t) {

    return t.map('SELECT * FROM questions', [], q => {

        return t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)

            .then(votes => {

                q.votes = votes;

                return q;

            });

    }).then(t.batch); // settles the array of generated promises

}


db.task(buildTree)

    .then(data => {

        console.log(data); // your data tree

    })

    .catch(error => {

        console.log(error);

    });

如果您只想使用單個(gè)查詢(xún),那么使用PostgreSQL 9.4及更高版本的語(yǔ)法可以執(zhí)行以下操作:


SELECT json_build_object('id', q.id, 'content', q.content, 'votes',

    (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))

     FROM votes v WHERE q.id = v.question_id))

FROM questions q

然后你的pg-promise示例將是:


const query =

    `SELECT json_build_object('id', q.id, 'content', q.content, 'votes',

        (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))

         FROM votes v WHERE q.id = v.question_id)) json

    FROM questions q`;


db.map(query, [], a => a.json)

    .then(data => {

        console.log(data); // your data tree

    })

    .catch(error => {

        console.log(error);

    });

而且你肯定會(huì)希望在外部SQL文件中保留這些復(fù)雜的查詢(xún)。請(qǐng)參閱查詢(xún)文件。


結(jié)論

上述兩種方法之間的選擇應(yīng)基于您的應(yīng)用程序的性能要求:


單查詢(xún)方法更快,但有些難以閱讀或擴(kuò)展,相當(dāng)冗長(zhǎng)

多查詢(xún)方法更容易理解和擴(kuò)展,但由于執(zhí)行的查詢(xún)的動(dòng)態(tài)數(shù)量,它對(duì)性能不是很好。

UPDATE


以下相關(guān)答案通過(guò)連接子查詢(xún)提供了更多選項(xiàng),這將提供更好的性能:將嵌套循環(huán)查詢(xún)組合到父結(jié)果pg-promise。


查看完整回答
反對(duì) 回復(fù) 2019-09-03
  • 3 回答
  • 0 關(guān)注
  • 761 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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