当前位置: 首页 > 知识库问答 >
问题:

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

韩麒
2023-03-14

我正在寻找解决方案,以检查是否多行从一个表有匹配在其他表。在我的情况下,我需要检查订单中的项目是否在存储中。目前,我使用php检查订单-script将打开的订单和foreach一个接一个地检查存储。它产生了相当多的查询,这是不是效率在所有,我正在寻找解决方案,以做这通过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,但仍然显示)。

如有任何帮助,多谢

编辑:fiddle示例:https://www.db-fiddle.com/f/6jkvkxpyvslexgm3qv1nhu/0

共有2个答案

巫马化
2023-03-14

我在db-fiddle链接上尝试了下面的查询,结果成功了。

SELECT
    orders.reference, orders.created_at, order_products.id_product
FROM
    storage_products 
LEFT JOIN 
    order_products ON storage_products.id_product = order_products.id_product 
LEFT JOIN
    orders ON orders.id = order_products.id_order;

我在查询中所做的是用order_products中相同的id_product调用所有的storage_products,然后继续调用所调用的order_products中的所有订单。

仲孙绍元
2023-03-14

您的查询包含以下条件:

AND `order_products`.`id_storage_product` IS NULL

但在示例数据中,所有值都是0
因此我使用coalesce()来覆盖这两种情况。
还删除了条件:

AND `orders`.`id_status` IN ( 1, 2 )

因为列ID_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

请参阅演示。
结果:

| id  | reference | created_at          | products      |
| --- | --------- | ------------------- | ------------- |
| 2   | 345554/02 | 2020-08-22 00:00:00 | 3x188 ; 1x155 |

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

 类似资料:
  • 我想按价格、日期和发布年份等项目对产品进行排序。在发布年份的情况下,我做了一个分类法=发布年份 但它是不工作.我怎么能改变代码可能排序按发布年份顺序?

  • 问题内容: 我正在为我的网上商店订购系统。我有2张桌子: 产品,存储有关产品的信息 订单,存储客户订单的一般ID和信息。 现在,我想拥有一种将复杂的客户订单存储在数据库中的方法。我需要一些东西让我知道订单中每种产品的大小(S,M或L)有多少。 棘手的部分是我希望能够添加/编辑/删除产品(当然不影响过去的订单),因此该方法应该灵活 我应该怎么做呢? 每个订单都有一个单独的表格,产品作为行? 所有订单

  • 让我告诉你一个我遇到的问题的例子。例如,我们有一个名为“订单”的表,其中插入了所有订单和采购。 表A(订单): 现在我想订购并获得我们最畅销的产品,例如在最畅销产品列表中获得pro3排名。 查询输出: 我写了这个查询: 结果对我没用。例如,我需要让pro27在畅销产品中排名(我们有100000个产品!)

  • 在函数的单个产品页面中获取产品的SKU时,我遇到了很多麻烦。php。我有多个单一产品页面,我希望根据产品显示不同的文本。我已经创建了一个子主题,我正在处理函数。php文件。我不熟悉wordpress和编辑主题,所以我还不太了解操作顺序。我能够让代码循环运行,并为所有产品提供所有SKU,但这与我所处的实际页面无关。 我试过很多东西。常见的解决方案似乎是: 但那不起作用。由于某些原因,$producs

  • 我尝试了很多,但当我找不到解决方案时,我将第一个问题发布在这里: 我有四张桌子: 当然,一个客户只能在一个订单中订购一次产品 在一个查询中,我想返回每个customer\u id以及order\u id和product\u id,这些客户在多个订单中订购了任何产品。 换句话说,对于每个客户,我希望找到客户多次订购的不同产品(在单独的订单中),以及product\u id和order\u id。因此

  • 我目前正在处理一个WooCommerce主题,并试图在产品详细信息页面中添加一个侧栏。 我已经能够添加侧边栏(特别是这个:http://woocommerce.wp-a2z.org/oik_file/templatescontent-widget-product-php/) 现在,我正在想如何在当前选择的产品中添加一类“活动”,但似乎无法解决? 换言之,如果当前产品id等于侧栏中的产品id,我该如

  • 我用下面的代码在我的WordPress网站上获得了WooCommerce形式的产品类别列表: 这工作正常,并返回产品类别的列表。我现在一直试图得到一个特定类别的产品列表。 示例:使用获取的所有产品。 我知道产品是作为帖子存储的,并且一直在努力做到这一点,但似乎做不到。 如何获取特定类别的产品列表?

  • 问题内容: 我很难提出一个查询,该查询将找到同时购买了PROD1和PROD2的所有客户。 这是一个伪查询,看起来像我想要做的:(显然这是行不通的) 因此,基本上,我正在尝试对表中有product_id’ ‘和’ ‘事务的不同用户ID的数量进行计数。每个事务都存储在表中的一行中。 问题答案: 我通过以下方式进行这种类型的查询: @najmeddine显示的解决方案还会产生您想要的答案,但在MySQL