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

虽然我最初是使用可见性来删除冗余实体​​,但是我不确定这是否适用于所有情况,或者是否存在两者都可见或隐藏的情况?

所以我的问题是

  1. 我应该如何更改我的 sql 声明,以便在可配置产品的情况下仅 select 一种产品(而不删除那些独立的简单产品?

  2. 此解决方案对版本 1.7、1.8 和 1.9 是否通用?

  3. 是否存在解决方案不起作用的情况?

注意。对于分组产品和捆绑产品,我当然应该得到所有简单的产品,因为它们每个实际上都代表一个真实的产品。

我找到的解决方案是将数据与 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 查询适用于所有版本和所有方案。