【发布时间】:2017-02-09 20:54:21
【问题描述】:
我正在创建一个应用程序,用户可以在其中提出问题,其他人可以投票/反对。
以下是我的 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()),但它只给了我值。 A JOIN 给了我一个投票加入的问题,并会迫使我进行服务器端操作,我不希望这样做。
有没有办法做到这一点?我对我想要获得什么的推理是错误的吗?
感谢您的宝贵时间。
【问题讨论】:
-
我想你在找
json_agg()和row_to_json() -
@a_horse_with_no_name 从 PostgreSQL 9.4 开始,
json_agg()+json_build_object()对提供了更好的解决方案。请参阅下面的答案。
标签: sql node.js postgresql