【发布时间】:2017-03-31 21:46:04
【问题描述】:
在我的 Rails 应用程序中,我在 Postgres 9.6 数据库中有一个典型的电子商务模式。这是它的简化版本:
users table
:name
products table
:name
shopping_carts table
:user_id
line_items table
:price
:qty
:product_id
:shopping_cart_id
我有一个有效的查询来返回每个用户购买的不同产品的数量:
SELECT COUNT(distinct p.*), u.name FROM products p
INNER JOIN line_items l ON p.id = l.product_id
INNER JOIN shopping_carts sc ON l.shopping_cart_id = sc.id
INNER JOIN users u ON sc.user_id = u.id
GROUP BY u.name
但我还想要为每个用户计算只有该特定用户购买的产品。 Ruby 中的一种可能的方法(使用 ActiveRecord 设置所有内容后)可能类似于:
def unique_prod(user)
user.products.select { |p| p.users.length == 1 }.count
end
但是如何在 SQL 中做到这一点?我想我需要使用两个计数来做 - 一个用于给定产品的 shopping_carts 中不同的user_ids 的数量(我们称之为计数user_count),然后是user_count = 1 的产品计数。我无法以工作方式合并多个 COUNT 和 GROUP BY 语句。有什么建议吗?
【问题讨论】:
标签: sql postgresql join aggregate