Woocommerce - 自定义MySQL查询 - 获取具有多个分类值的产品

时间:2018-05-11 20:55:44

标签: mysql woocommerce

我想编写一个自定义SQL查询来获取两个不同分类中具有两个特定值的产品(post_type ='product'的帖子)。

基本上,我希望获得具有特定颜色且属于特定类别的产品。

这两种分类法都可以在这里找到: enter image description here

  • product_cat 是该类别的分类
  • pa_colour 是颜色的分类(product attribute

以下是一个示例:我希望所有绿色的产品属于连衣裙

类别

我尝试了不同的方法。让我带你走过去。

如果我跑:

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/

2 个答案:

答案 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

相关问题