Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Mysql中检索类似的订单?_Mysql_Sql_Database - Fatal编程技术网

如何在Mysql中检索类似的订单?

如何在Mysql中检索类似的订单?,mysql,sql,database,Mysql,Sql,Database,我需要一个查询,应该首先查找状态为0(零)的最旧订单。并检索该类型的所有类似订单(匹配确切的总数量、itemSku和订购的不同项目的数量) 在上表中,查询应首先查看状态为0(在订单表中)的最旧(在ASC创建的)订单(即Id为1)。与该订单一起,它应该检索与相同项目SKU、数量和不同项目总数(在purchasedProducts表中)匹配的所有其他订单 在这里,订单1和订单3与相同的项目SKU(1000001和1000002)和数量(1和2)匹配,并且都有(2)个不同的项目计数,因此应该首先检索订

我需要一个查询,应该首先查找状态为0(零)的最旧订单。并检索该类型的所有类似订单(匹配确切的总数量、itemSku和订购的不同项目的数量)

在上表中,查询应首先查看状态为0(在订单表中)的最旧(在ASC创建的)订单(即Id为1)。与该订单一起,它应该检索与相同项目SKU、数量和不同项目总数(在purchasedProducts表中)匹配的所有其他订单

在这里,订单1和订单3与相同的项目SKU(1000001和1000002)和数量(1和2)匹配,并且都有(2)个不同的项目计数,因此应该首先检索订单1和订单3。当我将订单1和订单3标记为已发货时(即将状态更改为2)

若我再次运行查询,它将检索类似的排序器。现在,订单2和4与订单2和4相似。(具有相同的项目SKU(1000001,数量(3)和不同的项目计数(1))


请帮忙谢谢

你得在桌子上翻两遍:)

大概是这样的:

SELECT DISTINCT O2.ID
FROM OrdersTable O1
INNER JOIN PurchasedProductsTable P1 ON O1.ID = P1.OrderId
INNER JOIN PurchasedProductsTable P2 ON P1.itemSku = P2.itemSku 
  AND P1.Qty = P2.Qty 
INNER JOIN OrdersTable O2 ON O2.ID = P2.OrderId
WHERE O1.ID = 
        (SELECT ID FROM OrdersTable WHERE Status = 0 
              ORDER BY created_at ASC LIMIT 1)
  AND (SELECT COUNT(*) FROM PurchasedProductsTable WHERE OrderId = O1.ID)
     = (SELECT COUNT(*) FROM PurchasedProductsTable WHERE OrderId = O2.ID)
ORDER BY O2.ID ASC;

您可以通过限额获得最早的订单,并按日期订购。
然后您可以离开join以获得该订单以及至少具有相同项目的任何其他订单

然后,一旦您从子查询结果中获得了这些订单id,就可以获得订单详细信息

SELECT o.*
FROM
(
  SELECT DISTINCT ord2.ID as OrderId
  FROM 
  (
     SELECT ID, CustomerId, Status
     FROM OrdersTable
     WHERE Status = 0
     ORDER BY created_at
     LIMIT 1
  ) AS ord1
  JOIN PurchasedProductsTable AS pprod1
    ON pprod1.OrderId = ord1.ID
  LEFT JOIN OrdersTable ord2
    ON ord2.CustomerId = ord1.CustomerId
   AND ord2.Status = ord1.Status
  LEFT JOIN PurchasedProductsTable pprod2
    ON pprod2.OrderId = ord2.ID
   AND pprod2.itemSku = pprod1.itemSku
   AND pprod2.Qty = pprod1.Qty
  GROUP BY ord1.CustomerId, ord1.ID, ord2.ID
  HAVING COUNT(pprod1.itemSku) = COUNT(pprod2.itemSku)
) q
JOIN OrdersTable AS o ON o.ID = q.OrderId;

在RexTester上进行测试

到目前为止您尝试了什么?@kojow yeah虽然有效:))但只有在相同项目SKU以相同顺序多次添加时才有效:)当我将订单状态更改为ID 1和ID 2的1时,它不会显示任何内容。但它应该检索ID 3:)因此,即使没有与相同skuItems匹配的其他订单,您也希望显示状态为0的最早订单。是的,这正是我需要的:)如果它有其他匹配的订单,它将从上到下执行,否则将仅返回该订单。如果没有订单状态为0,则只有订单不显示任何内容:)@imDevD Updated。但是请注意,当前查询将获得最早的订单,以及具有相同项目的订单。但是那些其他订单可能比最早的订单有更多的项目。当我将第30行(('3','1000002','2')中的数量更改为('3','1000002','3')时,它仍然会在列表中检索订单id 3。这是不应该的。它应该只显示ID 1
SELECT o.*
FROM
(
  SELECT DISTINCT ord2.ID as OrderId
  FROM 
  (
     SELECT ID, CustomerId, Status
     FROM OrdersTable
     WHERE Status = 0
     ORDER BY created_at
     LIMIT 1
  ) AS ord1
  JOIN PurchasedProductsTable AS pprod1
    ON pprod1.OrderId = ord1.ID
  LEFT JOIN OrdersTable ord2
    ON ord2.CustomerId = ord1.CustomerId
   AND ord2.Status = ord1.Status
  LEFT JOIN PurchasedProductsTable pprod2
    ON pprod2.OrderId = ord2.ID
   AND pprod2.itemSku = pprod1.itemSku
   AND pprod2.Qty = pprod1.Qty
  GROUP BY ord1.CustomerId, ord1.ID, ord2.ID
  HAVING COUNT(pprod1.itemSku) = COUNT(pprod2.itemSku)
) q
JOIN OrdersTable AS o ON o.ID = q.OrderId;