我正在使用rails 5.0.0和postgresql
我有3个表,即orders
,cart_items
和products
。它们之间的关系如下:
订单has_many cart_items
cart_item belongs_to product
产品表包含产品的价格。
我想要做的是获取价格范围2500之间的订单数量,包含价值在0-2500之间,2500-5000之间的产品等等。
提前致谢。
答案 0 :(得分:2)
这里的概念是按照total_price
除以2500(我们在这里谈论整数除法)对每个订单进行分组,这样您就可以按照“切片类别”进行分组。
由于:
300/2500 = 0
400/2500 = 0
2500/2500 = 1
3000/2500 = 1
3000/2500 = 1
4999/2500 = 1
5000/2500 = 2
等。这是整数除法的结果,它将创建我之前称之为“切片类别”(1 => 0-2500,2 => 2500-5000,3 => 5000-7500等)。由于您的总价可能是十进制或浮点数,因此我“舍入”该值并将其转换为::integer
。
查询可以是这样的:
SELECT count(*), (sliced_2500_category + 1) * 2500 AS sliced_2500_group
FROM (
SELECT c.order_id, ROUND(SUM(price))::integer / 2500 AS sliced_2500_category
FROM cart_items c
INNER JOIN products p ON c.product_id = p.id
GROUP BY c.order_id
) orders_by_2500_category
GROUP BY sliced_2500_category;
答案 1 :(得分:0)
确保您的cart_items
也belongs_to :orders
和product
模型has_many cart_items
我猜您要选择0-2500范围内的发票/购物车等等。
原始SQL:
SELECT order_id, sum(price)
FROM cart_items c INNER JOIN products p
ON c.product_id = p.id
GROUP_BY order_id
HAVING sum(price) BETWEEN 0 AND 2500
控制器的必需声明:
CartItem.joins(:product)
.select(:order_id, 'sum(price)')
.group(:order_id)
.having('sum(price) BETWEEN 0 AND ?', params[:your_upper_limit_variable])