Как я могу получить похожие заказы в Mysql? - PullRequest
0 голосов
/ 20 января 2019

Мне нужен запрос, который должен сначала посмотреть самый старый заказ, который имеет статус 0 (ноль). и извлекает все подобные заказы такого типа (соответствует точному общему количеству, itemSku и количеству заказанных отдельных предметов).

***OrdersTable***
ID    OrderNumber    CustomerId    Status    created_at
1     123456         1             0         2018-01-01 
2     234567         1             0         2018-01-02
3     345678         1             0         2018-01-03
4     456789         1             0         2018-01-04   

***PurchasedProductsTable***
OrderId     itemSku     Qty
1           1000001     1
1           1000002     2
2           1000001     3
3           1000001     1
3           1000002     2
4           1000001     3

В приведенной выше таблице запрос должен сначала посмотреть на самый старый (созданный в ASC) заказ (т. Е. С идентификатором 1), имеющий статус 0 (в таблице заказов). и вместе с этим заказом он должен получить все остальные заказы, которые соответствуют тому же элементу itemSku, qty и общему количеству отдельных элементов (в таблице купленных продуктов).

здесь порядок 1 и 3 соответствует одному и тому же itemSKu (1000001 и 1000002) и количеству (1 и 2), и оба имеют (2) различное количество элементов соответственно, поэтому порядок 1 и 3 должен быть получен сначала. И когда я отметил порядок 1 и 3 в состоянии поставки (т.е. изменили статус на 2).

и если я снова запрошу запрос, он должен получить аналогичные команды. Теперь заказы 2 и 4, так как заказы 2 и 4 являются одинаковыми заказами (имеют один и тот же itemSkus (1000001, кол-во (3) и различное количество предметов (1)).

пожалуйста, помогите спасибо

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете получить самый ранний заказ через лимит и упорядоченный по дате.
Затем вы можете оставить соединение, чтобы получить этот заказ и любой другой заказ, который по крайней мере имеет те же предметы.

Затем, получив эти идентификаторы заказа из результата подзапроса, вы можете получить детали заказа.

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 здесь

0 голосов
/ 20 января 2019

Вам нужно пройти через ваши столы два раза:)

Примерно так:

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;

https://www.db -fiddle.com / f / 65t9GgSfqMpzNVgnrJp2TR / 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...