pgsql查询条件为在聚合后字段为字符串且还需要聚合后其他字段的查询方法

516 阅读1分钟

一般的查询条件为聚合后字段的查询方式如下:

首先IN查询操作形式是这样的

SELECT * FROM table_a WHERE userid IN(
    SELECT userid FROM table_b WHERE ... GROUP BY userid
)

如果聚合查询中我还需要其他字段的查询呢,如下所示,我还想把聚合查询下的COUNT(1) as num也需要查询到最后结果呢

SELECT * FROM table_a WHERE userid IN(
    SELECT userid,COUNT(1) as num FROM table_b WHERE ... GROUP BY userid
)

显然,IN下是不支持使用两个字段的,这时需要用到ANY操作,就是指表b中userids数组字段任一userid等于表a中的userid

SELECT 
    a.*,b.* 
FROM table_a a
LEFT JOIN table_b b
ON a.userid = ANY(b.userids)

其中表b是通过聚合查询得到的,如下

SELECT 
    a.*,b.num
FROM table_a a
LEFT JOIN (
    SELECT 
    array_agg(DISTINCT userid)::text[] as userids,
    COUNT(1) as num
    FROM table_b
    WHERE ... 
    GROUP BY userid
)b
ON a.userid = ANY(b.userids)

这样就满足本主题查询条件为在聚合后字段为字符串且还需要聚合后其他字段的需求了,其中array_agg函数是将userid聚合为数组结果。