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
:有多少用户将此产品添加到收藏夹中?
isfavorite
:user_id = 1
的用户是否将此产品添加为收藏?
预期结果:
product_id | product_name | 最喜欢 | favorite_count |
---|---|---|---|
1 | T 恤 | 假 | 0 |
2 | 衬衫 | 真实 | 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 值替换为您的默认值。