【问题标题】:Getting category name for each product in Magento with SQL only. Is this query slow?仅使用 SQL 在 Magento 中获取每个产品的类别名称。这个查询慢吗?
【发布时间】:2017-02-01 10:23:04
【问题描述】:

我正在处理 SQL 查询以导出产品所属的产品名称、ID 和相应的类别名称,以及产品平面表中存在的其他一些属性。

在数据库中,表名是:

`catalog_product_flat_1`, 
`catalog_category_product` and 
`catalog_category_flat_store_1`

我做了这个查询:

select pr.entity_id as product_id
     , pr.name as product_name
     , catn.name as category_name 
  from catalog_product_flat_1 as pr 
  left 
  join catalog_category_product as cat 
    on pr.entity_id = cat.product_id 
  left 
  join catalog_category_flat_store_1 as catn 
    on catn.entity_id = cat.category_id 
 order by pr.entity_id ASC;

现在可以达到目的。但这可以改善吗?我担心速度复杂性的原因是因为这家商店有 440k 产品

我在 stackoverflow 上遇到了另一个解决方案,它使用主表而不是平面表。但是有 4 个左连接。哪个会更快?我完全做错了吗?请不要将此标记为重复。

【问题讨论】:

  • 如果您正在寻找代码改进,最好在 Code Review StackExchange 上提出这个问题
  • 关于查询性能的问题总是需要,至少,所有相关表的 SHOW CREATE TABLE 语句,以及 EXPLAIN 的结果。顺便说一句,440k 是一个很小的数字,没有 ORDER BY 的 LIMIT 相当没有意义。

标签: php mysql sql magento


【解决方案1】:

这是通过子查询获取所有产品及其类别的 mysql 查询

SELECT 
  e.entity_id AS product_id
  , e.type_id AS product_type
  , e.sku,
  (
    SELECT
      GROUP_CONCAT(DISTINCT(cv.value))
    FROM 
      catalog_category_entity_varchar AS cv, catalog_category_product AS at_category_id 
    WHERE
      at_category_id.category_id = cv.entity_id
      AND (at_category_id.product_id = e.entity_id) 
      AND cv.attribute_id = 41 and cv.store_id = 0
  ) AS category_name 
FROM catalog_product_entity AS e;

我们也可以通过这个查询来实现,我认为它也可以优化。

【讨论】:

  • SQL 错误 [1054] [42S22]:“where 子句”中的未知列“cv.entity_id”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
相关资源
最近更新 更多