【问题标题】:SQL how to get select attribute that is array by join?SQL如何通过连接获取数组的选择属性?
【发布时间】:2016-10-10 09:38:26
【问题描述】:

我正在使用 postgresql。如何从第一张桌子到第二张桌子?谢谢

 id  | type | sum         
-----+------+-----
 1   | a    | 100
 2   | a    | 200
 3   | b    | 500


 t_sum | type | history          
-------+------+---------------
 300   | a    | ['id' => 1, 'sum' => 100], ['id' => 2, 'sum' => 200]
 500   | b    | ['id' => 3, 'sum' => 500]

我试过了,没有结果:

SELECT DISTINCT(a.type), SUM(a.sum) as t_sum, b.* as history FROM mytable a LEFT JOIN mytable b ON a.id = b.id GROUP BY a.type

【问题讨论】:

  • DISTINCT 不是一个函数,它是SELECT DISTINCT 的一部分 - 并且适用于整个选定的行。无论如何都不需要,因为 GROUP BY 不会返回重复项。
  • 你使用的是 MySQL 还是 Postgresql?

标签: sql postgresql join


【解决方案1】:

以下解决方案将最后一列作为json 数组返回:

SELECT sum(sum) AS t_sum,
       type,
       array_to_json(
          array_agg(
             json_build_object('id', id, 'sum', sum)
          )
       ) history
FROM history
GROUP BY type
ORDER BY type;

┌───────┬──────┬───────────────────────────────────────────────────┐
│ t_sum │ type │                      history                      │
├───────┼──────┼───────────────────────────────────────────────────┤
│   300 │ a    │ [{"id" : 1, "sum" : 100},{"id" : 2, "sum" : 200}] │
│   500 │ b    │ [{"id" : 3, "sum" : 500}]                         │
└───────┴──────┴───────────────────────────────────────────────────┘
(2 rows)

【讨论】:

  • 绝妙的答案,我刚刚在 Postgres 上检查过,它可以工作。
  • 谢谢。为什么简单的数组不起作用,只有 json 格式?我正在使用 php。
  • 当然,你可以使用一个简单的数组,这只是一个例子。但在这种情况下,['id' => 1, 'sum' => 100] 应该是什么数据类型?
  • 老实说,我不知道 Postgresql 返回什么数据类型。我猜像Array([1] => ['id' => 1, 'sum' => 100], [2] => ['id' => 2, 'sum' => 200]) 这样的简单数组
  • 是的,但是['id' => 1, 'sum' => 100] 是什么?一个字符串? hstore 值?我决定使用 JSON,但如果你告诉我你需要什么,我可以调整答案。
猜你喜欢
  • 2012-07-18
  • 2012-11-07
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2011-11-05
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多