我有一张表visitors(id, email, first_seen, sessions, etc.)
和另一个存储自定义用户提供的数据的表trackings(id, visitor_id, field, value)
。
我想查询这些内容并将访问者数据列和跟踪合并到一个名为data
例如,假设我有两个跟踪
(id: 3, visitor_id: 1, field: "orders_made", value: 2)
(id: 4, visitor_id: 1, field: "city", value: 'new york')
和访客
(id: 1, email: 'hello@gmail.com, sessions: 5)
我希望结果是
的形式(id: 1, data: {email: 'hello@gmail.com', sessions: 5, orders_made: 2, city: 'new york'})
使用Postgres 9.4实现此目的的最佳方法是什么?
答案 0 :(得分:0)
我首先要说跟踪是一个坏主意。如果你没有很多东西要跟踪,只需存储json;这就是为它做的。如果你有很多事情需要跟踪,那么随着时间的推移你会对跟踪的表现感到非常不满。
首先,你需要一个来自追踪的json对象:
-- WARNING: Behavior of this with duplicate field names is undefined!
SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...
为访客获取json相对容易:
SELECT row_to_json(email, sessions) FROM visitors WHERE ...;
我建议你不要把所有这些压在一起。如果您有一个名为电子邮件的字段会怎样?代替:
SELECT row_to_json((SELECT
(
SELECT row_to_json(email, sessions) FROM visitors WHERE ...
) AS visitor
, (
SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...
) AS trackings
));