3 回答

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。
添加回答
舉報(bào)