如何在Mysql中检索类似的订单?
我需要一个查询,应该首先查找状态为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))如何在Mysql中检索类似的订单?,mysql,sql,database,Mysql,Sql,Database,我需要一个查询,应该首先查找状态为0(零)的最旧订单。并检索该类型的所有类似订单(匹配确切的总数量、itemSku和订购的不同项目的数量) 在上表中,查询应首先查看状态为0(在订单表中)的最旧(在ASC创建的)订单(即Id为1)。与该订单一起,它应该检索与相同项目SKU、数量和不同项目总数(在purchasedProducts表中)匹配的所有其他订单 在这里,订单1和订单3与相同的项目SKU(1000001和1000002)和数量(1和2)匹配,并且都有(2)个不同的项目计数,因此应该首先检索订
请帮忙谢谢你得在桌子上翻两遍:) 大概是这样的:
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;