Для того, чтобы провести анализ корзины рынка с данными о продажах в 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
Сначала я хотел бы использовать видимость для удаления избыточных объектов, однако я не уверен, будет ли это работать во всех ситуациях или могут быть случаи, когда оба они либо видимы, либо скрыты?
Так что мои вопросы
Как я должен изменить свое заявление sql, чтобы выбрать только один продукт в случае настраиваемых продуктов (без перекомпоновки тех простых продуктов, которые стоят отдельно?
Является ли это решение универсальным для версий 1.7, 1.8 и 1.9?
Существуют ли сценарии, когда решение не работает?
NB. Для сгруппированных продуктов и связанных продуктов я, конечно, должен получить все простые продукты, поскольку каждый из них фактически представляет собой реальный продукт.
Вот запрос, который нужно использовать, чтобы исключить те простые продукты, чей соответствующий настраиваемый продукт уже включен в список
Просто добавьте приведенную ниже часть к исходному запросу.
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 работает во всех версиях и для всех сценариев.
Решение, которое я нашел, состояло в том, чтобы соединить данные с catalog_product_entity, а затем упорядочить данные по catalog_product_entity.type_id. Таким образом, все простые продукты были внизу, и при использовании GROUP BY я могу убедиться, что только простые продукты выбран, когда они одни.