MYSQL如何查找与当前存储产品匹配的订单产品(比较两个表以获得100%匹配)

MYSQL如何查找与当前存储产品匹配的订单产品(比较两个表以获得100%匹配),mysql,laravel,Mysql,Laravel,我正在寻找解决方案来检查一个表中的多行是否与另一个表中的行匹配。在我的情况下,我需要检查订单中的物品是否在仓库中。目前,我使用php检查订单-脚本接受未结订单,并逐个检查存储。它会生成很多查询,但效率很低,我正在寻找通过sql查询实现这一点的解决方案 预期结果应为: OrderId | Date | Products 1002/02 | 2020/08/16 | 1x Ipod; 2x battery; 9x some item; 0333/4 | 2020/06/22 |

我正在寻找解决方案来检查一个表中的多行是否与另一个表中的行匹配。在我的情况下,我需要检查订单中的物品是否在仓库中。目前,我使用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_状态);储存数量等于或大于订单中产品数量的;其中,id_storage_products为空(表示在网站上购买的产品,但订购时不在存储中)。 上面的查询结果是错误的,因为它显示了与存储的部分匹配-即使没有检查数量(某些产品有0,但仍然显示)

谢谢你的帮助


编辑:fiddle示例:

我在db fiddle链接上尝试了以下查询,效果良好

选择
orders.reference,orders.created\u at,order\u products.id\u product
从…起
存储产品
左连接
订购存储上的产品\u products.id\u product=订购产品\u products.id\u product
左连接
orders ON orders.id=order_products.id_order;

我在查询中所做的是调用order\u products中具有相同id的所有存储产品,并继续调用所调用order\u products中的所有订单。

我在db FIDLE链接上尝试了以下查询,结果成功

选择
orders.reference,orders.created\u at,order\u products.id\u product
从…起
存储产品
左连接
订购存储上的产品\u products.id\u product=订购产品\u products.id\u product
左连接
orders ON orders.id=order_products.id_order;

我在查询中所做的是调用order\u products中具有相同id的所有存储\u products,然后继续调用所调用order\u products中的所有订单。

您的查询包含以下条件:

AND `order_products`.`id_storage_product` IS NULL
AND `orders`.`id_status` IN ( 1, 2 )
但在示例数据中,所有值都是
0

因此,我使用
COALESCE()
来覆盖这两种情况。
我还删除了以下条件:

AND `order_products`.`id_storage_product` IS NULL
AND `orders`.`id_status` IN ( 1, 2 )
因为列
id\u status
不包括在示例数据中表
orders
的定义中。

此查询可用于:

SELECT o.id,
       o.reference,
       o.created_at,
       GROUP_CONCAT(op.quantity, 'x', op.id_product separator ' ;') products
FROM orders o
INNER JOIN order_products op ON o.id = op.id_order
INNER JOIN storage_products sp ON op.id_product = sp.id_product
WHERE sp.quantity >= op.quantity AND COALESCE(op.id_storage_product, 0) = 0
GROUP  BY o.id, o.reference, o.created_at
ORDER  BY o.id ASC
请参阅。
结果:


如果您也加入表
products
(我假设有这样一个表),您可以获得产品的名称,而不是它们的ID。

您的查询包含以下条件:

AND `order_products`.`id_storage_product` IS NULL
AND `orders`.`id_status` IN ( 1, 2 )
但在示例数据中,所有值都是
0

因此,我使用
COALESCE()
来覆盖这两种情况。
我还删除了以下条件:

AND `order_products`.`id_storage_product` IS NULL
AND `orders`.`id_status` IN ( 1, 2 )
因为列
id\u status
不包括在示例数据中表
orders
的定义中。

此查询可用于:

SELECT o.id,
       o.reference,
       o.created_at,
       GROUP_CONCAT(op.quantity, 'x', op.id_product separator ' ;') products
FROM orders o
INNER JOIN order_products op ON o.id = op.id_order
INNER JOIN storage_products sp ON op.id_product = sp.id_product
WHERE sp.quantity >= op.quantity AND COALESCE(op.id_storage_product, 0) = 0
GROUP  BY o.id, o.reference, o.created_at
ORDER  BY o.id ASC
请参阅。
结果:


如果您也加入表
products
(我假设有这样一个表),您可以获得产品的名称,而不是它们的ID。

欢迎加入。请查看您的问题以澄清您的要求。看起来您需要一个结果集,其中每个可发货订单都有一行——每个订单的所有产品都已经有库存(存储)。对吗?(我很难理解你问题的最后一段。)这里有一把小提琴——我希望它更清楚:欢迎来到这里。请查看您的问题以澄清您的要求。看起来您需要一个结果集,其中每个可发货订单都有一行——每个订单的所有产品都已经有库存(存储)。对吗?(我很难理解你问题的最后一段。)这里有一把小提琴——我希望它更清楚: