我想编写一个自定义SQL查询来获取两个不同分类中具有两个特定值的产品(post_type ='product'的帖子)。
基本上,我希望获得具有特定颜色且属于特定类别的产品。
以下是一个示例:我希望所有绿色的产品属于连衣裙
类别我尝试了不同的方法。让我带你走过去。
如果我跑:
SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term2.name = 'green' /* GREEN COLOUR */
我得到了所有具有属性pa_colour = green的产品,这是正确的结果。
然后如果我跑:
SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term1.name = 'dresses' /* DRESSES CATEGORY */
我得到了属于“连衣裙”类别的所有产品,这是正确的结果。
然而,当我同时查询两个分类法时,没有返回任何产品:
SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term2.name = 'green' /* GREEN COLOUR */
AND wp_term1.name = 'dresses' /* DRESSES CATEGORY */
如何修复查询以获取绿色颜色且属于连衣裙类别的产品?
注意:如果这里有用的是Woocommerce的数据库结构: http://www.webhat.in/article/woocommerce-tutorial/how-product-attribute-are-stored-in-database/
答案 0 :(得分:0)
尝试了许多不同的方法后找到了解决方案:
SELECT DISTINCT wp1.post_title
FROM wp_vge8pp_posts wp1
LEFT JOIN wp_vge8pp_term_relationships ON wp_vge8pp_term_relationships.object_id = wp1.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1 ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_terms wp_term1 ON wp_tax1.term_id = wp_term1.term_id
WHERE wp1.post_type = 'product' AND wp1.post_status = 'publish'
AND wp_term1.name = 'dresses'
AND EXISTS (
SELECT wp2.post_title
FROM wp_vge8pp_posts wp2
LEFT JOIN wp_vge8pp_term_relationships ON wp_vge8pp_term_relationships.object_id = wp2.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2 ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term2 ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_term2.name = 'green'
AND wp1.ID = wp2.ID
)
基本上我选择所有类别为“连衣裙”的产品,然后通过寻找颜色“绿色”缩小范围。
连接这两个类别的技巧是两次引用表(给它们不同的名称),然后在帖子ID的末尾连接它们:
wp1.ID = wp2.ID
另外,我添加了“DISTINCT”以确保结果中没有重复的产品。
答案 1 :(得分:0)
SELECT p.post_title
, t2.term_id
FROM wp_vge8pp_posts p
LEFT
JOIN wp_vge8pp_term_relationships tr
ON tr.object_id = p.ID
LEFT
JOIN wp_vge8pp_term_taxonomy tx1
ON tx1.term_taxonomy_id = tr.term_taxonomy_id
AND tx1.taxonomy = 'product_cat'
LEFT
JOIN wp_vge8pp_term_taxonomy tx2
ON tx2.term_taxonomy_id = tr.term_taxonomy_id
AND tx2.taxonomy = 'pa_colour'
LEFT
JOIN wp_vge8pp_terms t1
ON t1.term_id = tx1.term_id
-- B
LEFT
JOIN wp_vge8pp_terms wp_term2 t2
ON t2.term_id = tx2.term_id
-- A
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND t2.name = 'green' /* GREEN COLOUR */ -- MOVE THIS LINE TO A
AND t1.name = 'dresses' /* DRESSES CATEGORY */ -- AND THIS LINE TO B
如果您仍在努力,请参阅Why should I provide an MCVE for what seems to me to be a very simple SQL query