在 PostgreSQL 子查询的 WHERE 子句中使用别名

Using alias in subquery's WHERE clause in PostgreSQL

在 postgresql 中,我有一个用户 table,其中包含 namemeta_data 列。 Meta_data 列是 jsonb,我像这样存储数据:

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

对于每一个赞,我想select有相同赞的用户数量。

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 table 和 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)
)

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

column "like_id" does not exist.

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

然后像这样在 where 中使用相同的逻辑:

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

但似乎如果每行多于 1 行 like_id,您将有很多重复项,因此您应该使用 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