簡體   English   中英

MySQL 動態查詢使用來自查詢本身的信息

[英]MySQL dynamic query using info from query itself

我有一個查詢要從 WooCommerce 獲取產品數據。 產品具有變體(即屬性),並且與基礎產品相結合的每個屬性組合都是其自己的 SKU。 對於每個 SKU,數據都使用具有關聯值的相當通用的鍵(例如 _sku、_price)寫入 post_meta 表。 例外是屬性描述字段,奇怪的是,它的鍵是基於基本產品名稱本身。 這似乎沒有必要,因為我們已經知道它指的是哪個基礎產品。 盡管如此,它就是這樣完成的。

在下面的示例中,基本產品名稱是“Ford RAM 1500”。 我只是為測試做一個單一的變體,屬性是“拖車”,它指定了卡車的拖車類型。 拖車類型可以是“無拖車”、“hitch-2in”、“hitch-2.5in”、“hitch-3in”。 然后,它在 Post_Meta 表中創建一個名為“attribute_ford_ram_1500”的鍵,並為元值分配一個描述,例如“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`,
...

請記住,您必須使用p.post_title因為您不能在定義別名的同一選擇列表中引用別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM