使用PostgreSQLNodeJS将JOIN表作为结果数组获取

使用PostgreSQLNodeJS将JOIN表作为结果数组获取,第1张

概述我正在创建一个应用程序,用户可以在其中创建问题,而其他人则可以对其进行upvote / downvote. 以下是我的sql架构的一部分: CREATE TABLE "questions" ( id SERIAL, content VARCHAR(511) NOT NULL, created_at TIMESTAMP WITH TIME ZONE 我正在创建一个应用程序,用户可以在其中创建问题,而其他人则可以对其进行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给了我一个加上投票的问题,并迫使我做服务器端 *** 作,我不愿意这样做.

有没有办法做到这一点?我的理由是关于我想要获得的错误吗?

谢谢你的时间.

这很容易用 pg-promise:
function buildTree(t) {    return t.map('SELECT * FROM questions',[],q => {        return t.any('SELECT ID,value FROM Votes WHERE question_ID = ',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);    });

API:map,any,task,batch

相关问题:

> Get a parents + children tree with pg-promise
> Conditional task with pg-promise

如果您只想使用单个查询,那么使用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',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文件中保留这些复杂的查询.见Query Files.

结论

上述两种方法之间的选择应基于您的应用程序的性能要求:

>单查询方法更快,但有些难以阅读或扩展,相当冗长
>多查询方法更易于理解和扩展,但由于执行的查询的动态数量,它对性能而言并不好.

UPDATE

以下相关答案通过连接子查询提供了更多选项,这将提供更好的性能:Combine nested loop queries to parent result pg-promise.

总结

以上是内存溢出为你收集整理的使用PostgreSQL / NodeJS将JOIN表作为结果数组获取全部内容,希望文章能够帮你解决使用PostgreSQL / NodeJS将JOIN表作为结果数组获取所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1165916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存