我们有一个产品、订单、order_items、order_status 模式,如下所示。订单表状态字段,取值;ORDERED、RECEIVING、RECEIVED 和 CANCELED,如 order_status 表中所定义。
与此数据交互的 UI 确实有一个“产品视图”,每个产品都有行。当用户选择产品时,下方的另一个视图(订单中)列出了所选产品所在的订单。
用户应该能够根据产品订单状态过滤产品视图。特别是,一个按钮“On Order”应该过滤产品视图以仅显示在 In Orders 视图中有记录且状态为“ORDERED”的产品记录。
以下查询返回多个产品行,源于一个产品存在于多个订单中的事实。
SELECT products.*,
orders.`id` AS orderID,
orders.`status`
FROM products
LEFT JOIN order_items
ON products.`id` = order_items.`product_id`
JOIN orders
ON orders.`id` = order_items.`order_id`;
我们希望上述结果集在订单状态上“合并”。也就是说,对于每个不同的订单状态,结果集应该只有一个产品记录。然后,我们可以在“状态”字段中过滤产品视图。
下图显示了基于上述结果我们想要的结果集。红色表示它不应该是结果的一部分。
如上图所示;
- ID 为 18 的产品以相同的状态重复 3 次。我们只想要其中的一行。
- ID 为 19 的产品出现在 3 行中,其中两行具有相同的状态。保留状态相同的两行之一,以及状态 = 1 的行。
- ID 为 20 的产品以相同的状态重复两次,保留一个。
如何做到这一点?