Magento 1.x. Получить простой или настраиваемый продукт по SQL

Для того, чтобы провести анализ корзины рынка с данными о продажах в magento, мне нужно получить продукты, которые включены в каждый счет-фактуру, из magento. Пока это то, что я получил.

SELECT
tblInvoice.increment_id AS orderId,
tblLine.product_id AS productId,
tblLine.sku as productSku,
tblLine.qty as qty
FROM
sales_flat_invoice AS tblInvoice
RIGHT JOIN
sales_flat_invoice_item AS tblLine
ON tblInvoice.entity_id = tblLine.parent_id

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

 orderId    productId   productSku  qty
100000004   456         mpd00338    1.0000 <-- The simple product in this pair should be removed
100000004   476         mpd00338    1.0000 <-- The simple product in this pair should be removed
100000006   374         abl004      4.0000 <-- This simple product is alone, and should therefore stay
100000006   417         wbk002      1.0000 <-- Once again the simple product in this pair should be removed
100000006   284         wbk002      1.0000 <-- Once again the simple product in this pair should be removed

Сначала я хотел бы использовать видимость для удаления избыточных объектов, однако я не уверен, будет ли это работать во всех ситуациях или могут быть случаи, когда оба они либо видимы, либо скрыты?

Так что мои вопросы

  1. Как я должен изменить свое заявление sql, чтобы выбрать только один продукт в случае настраиваемых продуктов (без перекомпоновки тех простых продуктов, которые стоят отдельно?

  2. Является ли это решение универсальным для версий 1.7, 1.8 и 1.9?

  3. Существуют ли сценарии, когда решение не работает?

NB. Для сгруппированных продуктов и связанных продуктов я, конечно, должен получить все простые продукты, поскольку каждый из них фактически представляет собой реальный продукт.

0

Решение

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

Просто добавьте приведенную ниже часть к исходному запросу.

JOIN
sales_flat_order_item as sfoi
ON sfoi.item_id = tblLine.order_item_id
WHERE sfoi.parent_item_id IS NULL

Итак, ваш полный запрос должен быть таким

SELECT
tblInvoice.increment_id AS orderId,
tblLine.product_id AS productId,
tblLine.sku as productSku,
tblLine.qty as qty
FROM
sales_flat_invoice AS tblInvoice
RIGHT JOIN
sales_flat_invoice_item AS tblLine
ON tblInvoice.entity_id = tblLine.parent_id
JOIN
sales_flat_order_item as sfoi
ON sfoi.item_id = tblLine.order_item_id
WHERE sfoi.parent_item_id IS NULL

В таблице базы данных sales_flat_order_item есть этот столбец parent_item_id, в котором говорится, что он является дочерним по отношению к некоторому родительскому продукту (обычно настраиваемому продукту). Все эти записи в таблице sales_flat_order_item с пустым parent_item_id являются либо родительскими продуктами, либо отдельными продуктами (простыми / сгруппированными / связанными).

Этот запрос MySQL работает во всех версиях и для всех сценариев.

0

Другие решения

Решение, которое я нашел, состояло в том, чтобы соединить данные с catalog_product_entity, а затем упорядочить данные по catalog_product_entity.type_id. Таким образом, все простые продукты были внизу, и при использовании GROUP BY я могу убедиться, что только простые продукты выбран, когда они одни.

0