ID OrderNumber
1 123456
2 234567
3 345678
4 456789
***PurchasedProductsTable***
OrderId itemSku
1 1001
1 1002
2 1001
3 1001
3 1002
4 1001
В приведенной выше таблице я передаю значение itemSku, и запрос должен получить только тот itemSku, содержащий похожие заказы (в таблице purchasedProducts).
Здесь, если я передаю 1001, он соответствует itemSKu (1001) по идентификаторам порядка 2 и 4, поэтому извлекаются заказы 2 и 4, не содержащие других itemSku, поскольку идентификаторы заказа 2 и 4 содержат только этот номер 1001.
Если я снова запущу запрос с артикулами 1001 и 1002, он должен получить аналогичные порядки 1 и 3, поскольку порядок 1 и 3 содержит как артикулы 1001, так и 1002.
Я сделал такой запрос, но он работает не так, как ожидалось, он также извлекает другие несоответствующие заказы.
SELECT
o.id,
o.orderNumber
FROM
OrdersTable o
INNER JOIN PurchasedProductsTable p ON p.orderId = o.id
WHERE
p.itemSku IN ('1001')
GROUP BY
p.orderId HAVING COUNT(p.itemSku) = ?
ORDER BY
o.created_at DESC






SELECT o.ID, o.OrderNumber
FROM Orders o
JOIN PurchasedProductsTable ppt ON o.ID = ppt.OrderId
CROSS JOIN ( {SKUs list as a rowset, i.e. SELECT .. UNION SELECT ..} ) sku
GROUP BY o.ID, o.OrderNumber
HAVING COUNT(DISTINCT ppt.itemSku) = SUM(ppt.itemSku = sku.sku)
AND COUNT(DISTINCT sku.sku) = SUM(ppt.itemSku = sku.sku)
или же
SELECT o.ID, o.OrderNumber
FROM Orders o
JOIN PurchasedProductsTable ppt ON o.ID = ppt.OrderId
CROSS JOIN ( {SKUs list as a rowset} ) sku
GROUP BY o.ID, o.OrderNumber
HAVING GROUP_CONCAT(DISTINCT ppt.itemSku ORDER BY ppt.itemSku) = GROUP_CONCAT(DISTINCT sku.sku ORDER BY sku.sku)
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f12e0e4d401946b5617f74da8eb311a0
В этом ответе отсутствует образовательное объяснение.
Если здесь требуется DISTINCT, это укажет на более серьезные проблемы с существующей схемой. И отсутствие определения первичных ключей делает этот ответ неполным.
ppt.itemSku он не нужен, если PurchasedProductsTable (OrderId, itemSku) определен как уникальный. Для sku.sku это не нужно, если гарантировано отсутствие дубликатов в списке критериев.
@akina. Список артикулов в виде набора строк? Вы можете предоставить мне статический образец данных. Мне трудно сгенерировать его статически, так как я передам это значение вручную! Благодарность
@imDevD я передам это значение вручную Что такое точная форма предоставления данных? В моем решении список должен быть набором строк (или должен быть преобразован в набор строк) - какова точная версия MySQL?
@akina это 5.7.mysql_aurora.2.07.2. Можете ли вы привести мне пример набора данных, который будет похож на этот? относится к {списку артикулов в виде набора строк} this. ?
@imDevD Я не понимаю вашего вопроса. См. Скрипку - в ней заполнитель {SKUs list as a rowset} заменяется критериями, указанными в вашем вопросе в форме набора строк.
@Akina {список SKU как набор строк} означает что-то вроде CROSS JOIN ({'1001', '1002'}) sku вместо {SKUs list as a rowset} ??
@imDevD Посмотрите на скрипку по предоставленной ссылке.
@Akina, я передам 1001 и 1002 itemSku из внешнего интерфейса в api для запроса, поэтому мне не нужно выполнять такие запросы, как SELECT .. UNION SELECT .. в db. Итак, как я могу отформатировать свой список SKU элементов в набор строк {список SKU в виде набора строк} для выполнения запроса?
Пожалуйста, добавьте объяснение на простом английском языке к этому ответу, содержащему только код, в интересах ОП и тысяч будущих исследователей.
Есть над чем подумать: db-fiddle.com/f/cdtk6EnvAkUodUFcMiwHhj/0