以下是我的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表作为结果数组获取所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)