【问题标题】:How to merge and sum up certain values of items that have the same ID value如何合并和总结具有相同 ID 值的项目的某些值
【发布时间】:2021-01-17 22:35:16
【问题描述】:

所以我有 2 张桌子。 OrdersOrderItems。关系是每个Order可以有很多OrderItems(orderitem只是一个产品)。

订单项表

id INT PRIMARY KEY
name TEXT
quantity INT
pack_value INT
order_id INT FOREIGN KEY REFERENCES ORDER_ID ON ORDERS TABLE
product_id INT FOREIGN KEY REFERENCES PRODUCT_ID ON PRODUCTS TABLE

订单表

order_id INT PRIMARY KEY
status TEXT
user_id INT FOREIGN KEY REFERENCES USER_ID ON USERS TABLE

一个订单可以有两次或只有一次相同的 OrderItem。例如下图,3 件商品,2 件商品:

OrderItem(id=1, product_id=100, name="Pizza", quantity=2, pack_value=10, order_id=7)
OrderItem(id=2, product_id=100, name="Pizza", quantity=10, pack_value=1, order_id=7)
OrderItem(id=3, product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)

所以上面有两个Pizza 条目,这是我得到的结果。但是我希望它只显示 Pizza 的 1 个条目,因为它是同一个项目。以下是我想看到的:

OrderItem(product_id=100, name="Pizza", quantity=30, pack_value=1, order_id=7)
OrderItem(product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)

所以本质上,如果该项目只存在一次,那么什么都不做。如果它存在两次,则制作pack_value=1,数量为单个quantity*pack_value的总和。所以在上面的例子中,数量变为(2*10 + 10*1 = 30)

控制器方法如下所示,所以我要这样做:

public function showOrderDetails(Order $order){
    return view('orders.show', compact('order'));
}

OrderOrderItem 模型也有关系的方法。例如,在订单模型中,我有:

public function orderItems(){
    return $this->hasMany(OrderItem::class, 'order_id');
}

谢谢,如果您需要任何额外的信息,我可以提供。

【问题讨论】:

  • 同享 db fiddle
  • 小提琴中没有pack_value,插入你提到的示例数据
  • 下面是我想看到的解释quantity=2quantity=10是如何折叠成quantity=30的...
  • @Akina (2*10 + 10*1 = 30) 当 2 个项目相同时,它是每个项目的 quantity*pack_value 的总和。该值可以是 1(单件出售)或多个(多件装)

标签: php mysql laravel eloquent


【解决方案1】:
SELECT name, 
       SUM(quantity * pack_value) AS quantity,
       1 AS pack_value,
       order_id
FROM order_items
GROUP BY name,
         order_id;

fiddle

将其他表合并到此代码中,将其用作子查询,或根据需要将它们添加到 FROM 子句中(调整其输出列表和分组表达式)。

【讨论】:

  • 完美。太好了,谢谢你的例子。我从来不知道这些东西可以用 SQL 来实现,因为在过去的一天我试图用 php 来做。我将不得不了解更多。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 2021-04-12
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2018-05-22
相关资源
最近更新 更多