【发布时间】:2020-12-05 16:48:47
【问题描述】:
我正在寻找解决方案来检查一个表中的多行是否在另一个表中匹配。在我的情况下,我需要检查订单中的物品是否在存储中。目前我使用php来检查订单-脚本正在接受未结订单并逐一检查存储。它产生了很多查询,而且效率不高,我正在寻找通过 sql 查询执行此操作的解决方案。
期望的结果应该是:
OrderId | Date | Products
1002/02 | 2020/08/16 | 1x Ipod; 2x battery; 9x some item;
0333/4 | 2020/06/22 | 10x shelf
存储产品表
id | id_product | quantity
订单
id | reference | id_status | created_at
订购产品
Id | id_order | quantity | id_storage_product
我已经编写了一些代码来生成上面可见的表格,但结果它甚至没有接近预期。
select('orders.id', orders.created_at','orders.reference', 'storage_products.id as storageProductId')
->join('order_products', 'orders.id', '=', 'order_products.id_order')
->join('storage_products', 'order_products.id_product', '=', 'storage_products.id_product')
->where('storage_products.quantity', '>=', 'order_products.quantity')
->whereIn('orders.id_status', array(1, 2)) //get new orders/ open
->where('order_products.id_storage_product', null)
->groupBy('orders.id');
清理sql:
SELECT `orders`.`id`,
`orders`.`created_at`,
`orders`.`reference`,
`storage_products`.`id` AS `storageProductId`,
`order_products`.`id_order`
FROM `orders`
INNER JOIN `order_products`
ON `orders`.`id` =
`order_products`.`id_order`
INNER JOIN `storage_products`
ON `order_products`.`id_product` =
`storage_products`.`id_product`
WHERE `storage_products`.`quantity` >=
'order_products.quantity'
AND `orders`.`id_status` IN ( 1, 2 )
AND `order_products`.`id_storage_product` IS NULL
GROUP BY `orders`.`id`
ORDER BY `orders`.`id` ASC
所以代码应该找到未结订单(id_status);存储数量等于或大于订单产品;其中 id_storage_products 为空(表示在网站上购买的产品,但在订购时并未存储)。 上面的查询结果是错误的,因为它显示我与存储部分匹配 - 即使没有检查数量(有些产品有 0 但仍然显示)。
非常感谢您的帮助
编辑:小提琴样本:https://www.db-fiddle.com/f/6jKvKXPYvsLeXgm3Qv1nHu/0
【问题讨论】:
-
请edit您的问题澄清您的要求。看起来您想要一个结果集,每个可发货订单都有一行 - 每个订单的所有产品都已经有库存(存储)。那是对的吗? (我很难理解你问题的最后一段。)
-
这是一个小提琴 - 我希望它更清楚:db-fiddle.com/f/6jKvKXPYvsLeXgm3Qv1nHu/0