代码之家  ›  专栏  ›  技术社区  ›  user3782471

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

  •  1
  • user3782471  · 技术社区  · 9 年前

    在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”不存在。

    你对如何实现这一目标有什么建议吗?

    1 回复  |  直到 9 年前
        1
  •  2
  •   sagi    9 年前

    然后在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
    

    但是,如果每个like_id的行数超过1,则会有很多重复项,因此应该使用groupby。

    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