在postgresql中,我有一个包含name
和meta_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”不存在。
您对如何实现这一点有什么建议吗?
答案 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