从单个子查询中获取总计数和过滤计数

时间:2021-04-23 08:49:43

标签: sql postgresql aggregate-filter

product

<头>
product_id 姓名
1 T 恤
2 衬衫

users

<头>
user_id 姓名
1 狮身人面像

favorite 表在 UNIQUE 上具有 (user_id, product_id) 约束:

<头>
user_id product_id
1 2

查询此表的 user_id = 1 的最佳方法是什么

favorite_count:有多少用户将此产品添加到收藏夹中?
isfavoriteuser_id = 1 的用户是否将此产品添加为收藏?

预期结果:

<头>
product_id product_name 最喜欢 favorite_count
1 T 恤 0
2 衬衫 真实 1

1 个答案:

答案 0 :(得分:1)

通常,在联接之前聚合 n 表(在本例中为 favorite)中的行的成本最低:

SELECT p.*
     , COALESCE(f.is_favorite, false) AS is_favorite
     , COALESCE(f.favorite_count, 0)  AS favorite_count
FROM   product p
LEFT   JOIN (
   SELECT product_id
        , count(*) AS favorite_count            -- total count
        , bool_or(true) FILTER (WHERE user_id = 1) AS is_favorite  -- for given user
   FROM   favorite
   GROUP  BY 1
   ) f USING (product_id);

我们不需要用于查询的 users 表。

LEFT JOIN 将所有产品保留在结果中,同时仅添加具有收藏条目的产品的计数。

关于 FILTER 子句:

由于并非每个产品在表 favorite 中都有条目,因此在外部查询中使用 COALESCE() 将结果 NULL 值替换为您的默认值。

相关问题