2016-10-10 6 views
2

私はpostgresqlを使用しています。最初のテーブルから2番目のテーブルにアクセスするには?あなたSQL結合によって配列であるselect属性を取得する方法は?

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

+0

'DISTINCT'は関数ではありませんそれは 'SELECT DISTINCT'の一部であり、選択された行全体で動作します。 GROUP BYは重複を返さないので、とにかく必要はありません。 – jarlh

+0

MySQLまたはPostgresqlを使用していますか? – jarlh

答えて

3

次のソリューションは、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) 
+0

華麗な答え、私はPostgresでこれをチェックしています。 –

+0

ありがとうございます。なぜ単純な配列が動作しないのですか、json形式だけですか?私はPHPを使用しています。 – sirjay

+0

もちろん、シンプルな配列を使うことができますが、これは単なる例です。しかし、その場合、どのデータ型が '['id' => 1、 'sum' => 100 'でなければなりませんか? –

関連する問題