Gridens - информационные технологии

Извлекать только совпадающие записи из двух сущностей

Пожалуйста, помогите мне с запросом MYSQL.

Имя объекта: Атрибуты OrderItem: orderId (PK), orderItemSeqId (PK), productId

Имя объекта: ProductFacility Атрибуты: acacilityId(PK), productId(PK), inventoryCount (целое число)

**OrderId  | orderItemSeqId | productId**

  OID1     |       0001     |   10000 

  OID1     |       0002     |   10001 

  OID1     |       0003     |   10002


**FacilityId | ProductId | InventoryCount**

  FC_1     |   10000    |    12

  FC_1     |   10001    |    5

  FC_1     |   10002    |    7

  FC_2     |   10001    |    1

  FC_2     |   10002    |    6

  FC_3     |   10002    |    7

Здесь я хочу получить объект (FC_1), в котором есть все продукты, доступные для заказа.

Мне не нужны записи объектов с частичными продуктами (например, объект FC_3 имеет только один (10002) продукт из заказа OID1)

Мне нужны только записи объекта, в которых есть все продукты из заказа (например, OID1)

ВАЖНЫЙ МОМЕНТ: этот SQL будет выполняться для миллионов записей.


  • Привет @LalitDashora, на этот вопрос уже есть несколько ответов. Кто-нибудь из них помог вам? Прокомментируйте, если это не так... Вы также можете проголосовать, если ответ был вам полезен... И вы можете принять правильный ответ. Если вы не знаете, как это сделать, спросите. Было бы неплохо от вас поблагодарить людей, которые помогли вам с вашим вопросом. Ваше здоровье! 21.01.2020

Ответы:


1

Попробуй это:

select * 
from ProductFacility  f1
where (select count(distinct InventoryCount) cnt_fac
       from ProductFacility  f2
       where f2.FacilityId = f1.FacilityId
       and InventoryCount > 0
       group by FacilityId ) = (select count(distinct productId) 
                                from OrderItem );

Вот DEMO

20.01.2020
  • Это работает, только если в OrderT есть только один заказ: dbfiddle.uk/ 20.01.2020
  • По-прежнему не работает, если в OrderItem dbfiddle.uk/ 20.01.2020
  • Я дал вам демонстрацию с 2 заказами - вы можете проверить свой запрос там... 20.01.2020
  • Я сделал, он возвращает значения. dbfiddle.uk/ Спасибо! 20.01.2020
  • @LalitDashora, так это работает? Если нет, то почему? Ваше здоровье! 20.01.2020

  • 2

    Это даст вам средства, которые вы ищете

    with cte as
    (
     select OrderId, count(*)      as c
     from orderT a
     group by OrderId
    )
    select FacilityId, b.OrderId, count(*) as c from Facility a
    inner join orderT b on a.ProductId  = b.ProductId
    group by FacilityId, b.OrderId
    having count(*) = (select c from cte c where c.OrderId = b.OrderId)
    
    20.01.2020

    3

    Чтобы получить список объектов, которые могут удовлетворить заказ, вам нужно проверить, какой объект имеет InventoryCount > 0 для каждого продукта в заказе, что вы можете сделать с помощью этого запроса:

    SELECT O.OrderId, F.FacilityID
    FROM (SELECT DISTINCT productId
          FROM OrderItem) P
    CROSS JOIN (SELECT DISTINCT OrderId
                FROM OrderItem) O
    CROSS JOIN (SELECT DISTINCT FacilityId
                FROM ProductFacility) F
    LEFT JOIN OrderItem OI ON OI.OrderId = O.OrderID AND OI.productId = P.productId
    LEFT JOIN ProductFacility PF ON PF.FacilityId = F.FacilityId AND PF.productId = OI.productId AND PF.InventoryCount > 0
    GROUP BY O.OrderId, F.FacilityID
    HAVING COUNT(OI.ProductId) = COUNT(PF.ProductId)
    

    Я добавил в свою демонстрацию дополнительный заказ, для которого требуются продукты 10001 и 10002; для этого вывод

    OrderId     FacilityID
    OID1        FC_1
    OID2        FC_1
    OID2        FC_2
    

    Демонстрация SQLFiddle

    20.01.2020
  • Просто примечание: на этой скрипке в MySQL 8 и MySQL 5.7 есть ошибки: 20.01.2020

  • 4

    Это должно работать:

    select oc.orderId, ofc.facilityId
    from
    (
       select orderId, count(*) productCount
       from OrderItem
       group by orderId) oc 
    inner join
    (
       select pf.facilityId, oi.orderId, count(*) productsAvailableCount
       from ProductFacility pf
       inner join OrderItem oi on oi.productId = pf.productId and pf.inventoryCount > 0
       group by pf.facilityId, oi.orderId
    ) ofc on ofc.orderId = oc.orderId and oc.productCount = ofc.productsAvailableCount
    

    Демонстрация скрипта БД

    20.01.2020
    Новые материалы

    Журналы Py № 2: Если, Элиф, Иначе?
    У меня такое чувство, будто я давно ничего не писал, хотя прошло два дня с тех пор, как я опубликовал свою первую историю. В любом случае, сегодня произошло много всего, так что приступим...

    Работа в Реакции
    Я изучаю React в Bloc прямо сейчас. До сих пор я изо всех сил пытался понять темы. Тем не менее, я только что закончил проблему, над которой некоторое время размышлял, и хочу записать свой..

    Нужен ли банкам искусственный интеллект, чтобы кардинально изменить свою работу?
    Почему необходимо использовать искусственный интеллект в банковской сфере? Существенное использование многочисленных инноваций ИИ, таких как машинное обучение , глубокое обучение и..

    Какую последнюю статью вы считаете стоящей поделиться?
    Я люблю читать качественные статьи. Не стесняйтесь делиться своей работой.

    Преобразование CoreML, позволяющее использовать Fast-Neural-Style-Transfer на iOS и MacOS.
    Как использовать Fast-Neural-Style-Transfer на iOS Преобразованная модель: GitHub — john-rocky/CoreML-Models: Преобразованный зоопарк моделей CoreML...

    ИИ в правоохранительных органах: мощный инструмент с двойной природой
    Искусственный интеллект (ИИ) революционизирует правоохранительную деятельность, предлагая инновационные тактики расследования, повышая достоверность доказательств и оптимизируя процессы. Тем..

    Autoencoder Average Distance  — классический способ, используемый внутри Microsoft для выявления сходства…
    Среднее расстояние автоэнкодера (AAD) использует более простой подход для определения расстояния между двумя наборами данных. Нейронный автоэнкодер может преобразовать любой элемент данных в..