2016-02-10 89 views
1

在postgresql中,我有一个包含namemeta_data列的用户表。 Meta_data列jsonb,我喜欢存储数据:在PostgreSQL的子查询的WHERE子句中使用别名

"{"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 

此外我有user_idclickouts表。我需要具有该特定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.

你有什么建议如何做到这一点?

+0

'..,COUNT(jsonb_array_elements(users.meta_data->” like') - >>'id')AS..'您需要重复表达式 – Mihai

回答

0

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

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,你就会有很多重复的,所以你应该使用组。

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 
+0

谢谢第二种解决方案。但是我需要子查询中的'like_id'。我更新了这个问题。如果我尝试你的第一个解决方案,我得到这个错误:WHERE参数不能返回一个集合。 – user3782471

+0

@ user3782471如果你用另一个选择包装你的查询,你将能够使用这个别名。我编辑了我的问题。接受查询并根据需要进行调整。 – sagi

+0

这就是我一直在寻找的!谢谢。 – user3782471