【问题标题】:How to properly loop through a table and output to an array in PostgreSQL?如何正确循环遍历表并输出到 PostgreSQL 中的数组?
【发布时间】:2013-07-21 20:34:09
【问题描述】:

这是一个数据库示例

table "Users"
fname | lname | id | email 
Joe   | smith | 1  | yadda@goo.com
Bob   | smith | 2  | bob@goo.com
Jane  | smith | 3  | jane@goo.com

table "Awards"
userId | award 
1      | bigaward
1      | smallaward
1      | thisaward
2      | thataward

table "Invites"
userId | invited
1      | true
3      | true

基本上,您如何在 PostgreSQL 中编写一个允许您创建如下内容的查询:

[{
     fname:"Joe",
     lname:"Smith",
     id: 1,
     email: "yadda@goo.com",
     invited: true,
     awards: ["bigaward", "smallaward", "thisaward"]
 },
 {
     fname:"Jane",
     lname:"Smith",
     id: 3,
     email: "jane@goo.com",
     invited: true,
     awards: []
 }]

这就是我想要做的......

SELECT users.fname, users.lname, users.id, users.email, invites.invited, awards.award(needs to be an array)
FROM users
JOIN awards on ....(unknown)
JOIN invites on invites.userid = users.id
WHERE invited = true

上面的数组将是所需的输出,只是无法找出一个好的一次性查询。我尝试了 PostgreSQL 文档,但无济于事。我想我可能需要一个 WITH 语句?

在此先感谢 Postgres 大师!

PostgreSQL v. 9.2

RhodiumToad 在 postgresql IRC 上回答:

SELECT users.fname, users.lname, .... array(select awards.award from awards where a.id = user.id) as awards
FROM users
JOIN invites on invites.userid = users.id
WHERE invited = true

array() 然后通过它里面的查询...太棒了!

【问题讨论】:

  • 我不认为这是那个问题的 duplicate,因为最终输出被重新规范化,尽管它可以以相对简单的方式查询数据。
  • 请澄清:您想要有效的 JSON 格式吗?另外,总是,你的 Postgres 版本。
  • Erwin,它已更新,它是通过 node.js 上的 sequelize 进行的原始查询,它总是输出 JSON。谢谢!

标签: sql node.js postgresql


【解决方案1】:

我觉得可以这么简单:

SELECT u.fname, u.lname, u.id, u.email, i.invited, array_agg(a.award)
FROM   users u
JOIN   invites i ON i.userid = u.id AND i.invited
LEFT   JOIN awards a ON a.userid = u.id
GROUP  BY u.fname, u.lname, u.id, u.email, i.invited

您以 JSON 格式显示只会让它看起来更复杂。

使用基本的GROUP BY,包括所有不聚合的列 - 留下award,您可以在聚合函数array_agg() 的帮助下将其聚合到一个数组中。

LEFT JOIN 很重要,所以不要误将没有任何奖励的用户排除在外。

请注意,我在示例中忽略了 CaMeL 大小写拼写,以避免丑陋的双引号。

对于更大的表来说,这比众所周知的慢correlated subqueries 快得多 - 就像问题中添加的示例中所展示的那样。

->SQLfiddle demo

【讨论】:

    【解决方案2】:

    您将需要使用 hasNext 或 forEach(或类似)方法来遍历数据库。在迭代时,您可以将结果添加到数组中,然后将该数组编码为 JSON。

    我想我可能误解了你的问题。如有不妥,请见谅

    【讨论】:

    • 我想你确实误会了。 Q 令人困惑。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2014-05-11
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多