在PostgreSQL

时间:2016-02-10 10:59:10

标签: postgresql jsonb

在postgresql中,我有一个包含namemeta_data列的用户表。 Meta_data列是jsonb,我存储的数据如下:

"{"likes": [{"id": "1", "name": "aaa"}, {"id": "2", "name": "bbb"}, {"id": "3", "name": "ccc"}]}"

对于每个人来说,我想选择具有相同功能的用户数。

SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
(SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = like_id ) AS count_users
FROM users

此外,我有一个clickouts表,其中包含user_id列。我需要具有特定like_id的用户进行的点击次数。

COUNT(clickouts.id) FILTER ( 
    WHERE clickouts.user_id IN 
    (SELECT user_id FROM users WHERE users.meta_data->'likes'->>'id' = like_id)
)

这些查询不起作用。错误消息是:

  

列“like_id”不存在。

您对如何实现这一点有什么建议吗?

1 个答案:

答案 0 :(得分:2)

然后在这样的地方使用相同的逻辑:

SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
(SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = jsonb_array_elements(users.meta_data->'likes')->>'id' ) AS count_users
FROM users

但似乎每个like_id有超过1行,你会有很多重复,所以你应该使用group by。

SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
count(jsonb_array_elements(users.meta_data->'likes')->>'id') AS count_users
FROM users
GROUP BY jsonb_array_elements(users.meta_data->'likes')->>'id'

编辑:

如果要在内部查询中使用别名,请尝试以下操作:

SELECT t.like_id,
       (SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = t.like_id ) AS count_users FROM (
SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
FROM users) t