MySQL动态查询使用查询本身的信息

我有一个查询要从WooCommerce获取产品数据。产品具有变体(即属性),并且与基本产品结合的每个属性组合都是其自己的SKU。对于每个SKU,数据会使用具有关联值的相当通用的键(例如_sku,_price)写入post_meta表中。属性描述字段是一个例外,奇怪的是,它的键是基于基本产品名称本身的。这似乎没有必要,因为我们已经知道它指的是哪个基本产品。尽管如此,这就是完成的方式。

在下面的示例中,基本产品名称为“福特RAM 1500”。我只是做一个测试变体,属性是“ trailer”,它指定随卡车一起使用的拖车类型。预告片类型可以是“无预告片”,“ hitch-2in”,“ hitch-2.5in”,“ hitch-3in”。然后,它在Post_Meta表中创建一个名为“ attribute_ford_ram_1500”的键,并将为meta_value分配一个描述,例如“ hitch-2in $ 25,269”-变动商品和包括该变动的总价。

到目前为止,这是我的查询:

SELECT * FROM
(
SELECT p.ID,
p.post_title 'name',  -- Ford RAM 1500
p.post_content 'description',
GROUP_CONCAT(cat.name SEPARATOR ' | ') 'Category',
MAX(CASE WHEN meta.meta_key = '_sku' THEN meta.meta_value END) 'SKU',
MAX(CASE WHEN meta.meta_key = 'attribute_trailer' THEN meta.meta_value END) 'Trailer',  -- Trailer type added to product, or none
MAX(CASE WHEN meta.meta_key = 'attribute_ford_ram_1500' THEN meta.meta_value END) 'Var_Description',  -- Ford RAM 1500 is from the p.post_title (name) field above
MAX(CASE WHEN meta.meta_key = '_price' THEN meta.meta_value END) 'Price',
MAX(CASE WHEN meta.meta_key = '_weight' THEN meta.meta_value END) 'Weight',
MAX(CASE WHEN meta.meta_key = '_stock' THEN meta.meta_value END) 'Stock'
FROM wp_posts AS p
JOIN wp_postmeta AS meta ON p.ID = meta.post_ID
LEFT JOIN
(
SELECT pp.id,
GROUP_CONCAT(t.name SEPARATOR ' > ') AS name
FROM wp_posts AS pp
JOIN wp_term_relationships tr ON pp.id = tr.object_id
JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t ON tt.term_id = t.term_id
|| tt.parent = t.term_id
WHERE tt.taxonomy = 'product_cat'
GROUP BY pp.id, tt.term_id
) cat ON p.id = cat.id
WHERE (p.post_type = 'product' OR p.post_type = 'product_variation')
AND meta.meta_key IN ('_sku', '_price', '_weight', '_stock','attribute_foundation','attribute_ford_ram_1500')  -- Would need to dynamically change the last attribute based on the p.post_title (name) field
AND meta.meta_value is not null
GROUP BY p.ID
) d
WHERE d.SKU IS NOT NULL

这很好用-对于一种基本产品。但是,可以说还有福特RAM 2500产品。对于它的变体,不会有meta.meta_key ='attributes_ford_ram_1500';而是meta.meta_key ='attributes_ford_ram_2500'。我假设我需要做一些更动态的事情。所以我的问题是,如何使查询基于该结果行中的post_title(名称)找到正确的meta_key名称?

评论
  • 过路人
    过路人 回复

    您应该可以使用表达式来构成meta_key,而不是对其进行硬编码:

    ...
    MAX(CASE WHEN meta.meta_key = CONCAT('attribute_', 
        REPLACE(p.post_title, ' ', '_')) 
      THEN meta.meta_value END) AS `Var_Description`,
    ...
    

    Remember you have to use p.post_title because you can't refer to an alias in the same select-list where the alias is defined.