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

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

使用PostgreSQL / NodeJS將JOIN表作為結果數組獲取

使用PostgreSQL / NodeJS將JOIN表作為結果數組獲取

鴻蒙傳說 2019-09-03 19:15:19
我正在創建一個用戶可以創建問題的應用程序,而其他人可以對其進行upvote / downvote。以下是我的sql架構的一部分: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給我的每個問題都有一系列投票,像這樣:[{ // a question  id: 1,  content: 'huh?',  votes: [{ // a vote    id: 1,    value: 1  }, { // another vote    id: 2,    value: -1  }]}, { /*another question with votes*/ }]我查看了聚合函數(如array_agg()),但它只給了我一些值。一個JOIN給了我一個加上投票的問題,并迫使我做服務器端操作,我不愿意這樣做。有沒有辦法做到這一點?關于我想弄錯的是什么原因?謝謝你的時間。
查看完整描述

3 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

pg-promise很容易做到這一點:


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);

    });

如果您只想使用單個查詢,那么使用PostgreSQL 9.4及更高版本的語法可以執行以下操作:


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);

    });

而且你肯定會希望在外部SQL文件中保留這些復雜的查詢。請參閱查詢文件。


結論

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


單查詢方法更快,但有些難以閱讀或擴展,相當冗長

多查詢方法更容易理解和擴展,但由于執行的查詢的動態數量,它對性能不是很好。

UPDATE


以下相關答案通過連接子查詢提供了更多選項,這將提供更好的性能:將嵌套循環查詢組合到父結果pg-promise。


查看完整回答
反對 回復 2019-09-03
  • 3 回答
  • 0 關注
  • 763 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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