Как я могу получить похожие заказы, имеющие точное соответствие itemSku в Mysql?

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

Есть над чем подумать: db-fiddle.com/f/cdtk6EnvAkUodUFcMiwHhj/0

Strawberry 30.03.2021 08:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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

В этом ответе отсутствует образовательное объяснение.

mickmackusa 30.03.2021 09:00

Если здесь требуется DISTINCT, это укажет на более серьезные проблемы с существующей схемой. И отсутствие определения первичных ключей делает этот ответ неполным.

Strawberry 30.03.2021 09:02
Если здесь нужен DISTINCT Для ppt.itemSku он не нужен, если PurchasedProductsTable (OrderId, itemSku) определен как уникальный. Для sku.sku это не нужно, если гарантировано отсутствие дубликатов в списке критериев.
Akina 30.03.2021 09:08

@akina. Список артикулов в виде набора строк? Вы можете предоставить мне статический образец данных. Мне трудно сгенерировать его статически, так как я передам это значение вручную! Благодарность

imDevD 30.03.2021 09:23

@imDevD я передам это значение вручную Что такое точная форма предоставления данных? В моем решении список должен быть набором строк (или должен быть преобразован в набор строк) - какова точная версия MySQL?

Akina 30.03.2021 09:25

@akina это 5.7.mysql_aurora.2.07.2. Можете ли вы привести мне пример набора данных, который будет похож на этот? относится к {списку артикулов в виде набора строк} this. ?

imDevD 30.03.2021 09:31

@imDevD Я не понимаю вашего вопроса. См. Скрипку - в ней заполнитель {SKUs list as a rowset} заменяется критериями, указанными в вашем вопросе в форме набора строк.

Akina 30.03.2021 09:40

@Akina {список SKU как набор строк} означает что-то вроде CROSS JOIN ({'1001', '1002'}) sku вместо {SKUs list as a rowset} ??

imDevD 30.03.2021 09:42

@imDevD Посмотрите на скрипку по предоставленной ссылке.

Akina 30.03.2021 09:43

@Akina, я передам 1001 и 1002 itemSku из внешнего интерфейса в api для запроса, поэтому мне не нужно выполнять такие запросы, как SELECT .. UNION SELECT .. в db. Итак, как я могу отформатировать свой список SKU элементов в набор строк {список SKU в виде набора строк} для выполнения запроса?

imDevD 30.03.2021 10:01
поэтому мне не нужно делать такие запросы, как SELECT .. UNION SELECT .. в db Вы должны. Все методы преобразования списка значений CSV в набор строк либо слишком сложны, либо требуют версии 8.0.4+.
Akina 30.03.2021 10:46

Пожалуйста, добавьте объяснение на простом английском языке к этому ответу, содержащему только код, в интересах ОП и тысяч будущих исследователей.

mickmackusa 31.03.2021 00:48

Другие вопросы по теме