Magento 1.x。通过 sql 获得简单或可配置的产品
Magento 1.x. Get either simple or configuable product by 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
虽然我最初是使用可见性来删除冗余实体,但是我不确定这是否适用于所有情况,或者是否存在两者都可见或隐藏的情况?
所以我的问题是
我应该如何更改我的 sql 声明,以便在可配置产品的情况下仅 select 一种产品(而不删除那些独立的简单产品?
此解决方案对版本 1.7、1.8 和 1.9 是否通用?
是否存在解决方案不起作用的情况?
注意。对于分组产品和捆绑产品,我当然应该得到所有简单的产品,因为它们每个实际上都代表一个真实的产品。
我找到的解决方案是将数据与 catalog_product_entity 连接起来,然后按 catalog_product_entity.type_id 对数据进行排序。这样所有简单的产品都在底部,并且在使用 GROUP BY 时然后我可以确保只有简单的产品在单独时才被选中。
这是您需要用来排除那些其相应的可配置产品已包含在列表中的简单产品的查询
只需将以下部分附加到您的原始查询中
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 数据库 table 有这个 parent_item_id 列,表明它是某些父产品(通常是可配置产品)的子产品。 table sales_flat_order_item 中 parent_item_id 为空的所有记录要么是父产品,要么是单个产品 ( simple/grouped/bundled )。
此 MySQL 查询适用于所有版本和所有方案。
为了对 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 声明,以便在可配置产品的情况下仅 select 一种产品(而不删除那些独立的简单产品?
此解决方案对版本 1.7、1.8 和 1.9 是否通用?
是否存在解决方案不起作用的情况?
注意。对于分组产品和捆绑产品,我当然应该得到所有简单的产品,因为它们每个实际上都代表一个真实的产品。
我找到的解决方案是将数据与 catalog_product_entity 连接起来,然后按 catalog_product_entity.type_id 对数据进行排序。这样所有简单的产品都在底部,并且在使用 GROUP BY 时然后我可以确保只有简单的产品在单独时才被选中。
这是您需要用来排除那些其相应的可配置产品已包含在列表中的简单产品的查询
只需将以下部分附加到您的原始查询中
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 数据库 table 有这个 parent_item_id 列,表明它是某些父产品(通常是可配置产品)的子产品。 table sales_flat_order_item 中 parent_item_id 为空的所有记录要么是父产品,要么是单个产品 ( simple/grouped/bundled )。
此 MySQL 查询适用于所有版本和所有方案。