高级Wordpress MySQL查询选择产品和属性

时间:2013-09-22 17:46:03

标签: mysql sql wordpress woocommerce

过去6个小时我一直在这,所以我想我会在这里寻求帮助。

我的目标是在网站的页面上显示数据库中的所有产品。这些产品是域名,每个域名都有需要显示的属性。

我很难过,这是我到目前为止所得到的:

SELECT p.id, p.post_title, p.guid, 
       meta_price.meta_value as price, 
       mozrank.name as mozrank, 
       pa.name as pa 
  FROM wp_posts p 
 INNER JOIN wp_postmeta meta_price ON p.id=meta_price.post_id 
            AND meta_price.meta_key='_regular_price' 
 INNER JOIN wp_postmeta meta_instock ON p.id=meta_instock.post_id 
            AND meta_instock.meta_key='_stock_status' 
 INNER JOIN wp_term_relationships relationships ON p.id=relationships.object_id 
 INNER JOIN wp_term_taxonomy ttmozrank ON ttmozrank.taxonomy='pa_mozrank' 
            AND ttmozrank.term_taxonomy_id=relationships.term_taxonomy_id 
 INNER JOIN wp_terms mozrank ON mozrank.term_id=ttmozrank.term_id 
 INNER JOIN wp_term_taxonomy ttpa ON ttpa.taxonomy='pa_pa' 
            AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id 
 INNER JOIN wp_terms pa ON pa.term_id=ttpa.term_id 
  WHERE p.post_status = 'publish' 
    AND post_type = 'product' 
    AND meta_price.meta_value<>''
    AND meta_instock.meta_value = 'instock'
  GROUP BY p.id

删除此块时,MySQL会输出我想要的内容,但只能输出一个属性。

        INNER JOIN wp_term_taxonomy ttpa ON ttpa.taxonomy='pa_pa' 
            AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id 
        INNER JOIN wp_terms pa ON pa.term_id=ttpa.term_id 

我想展示一些属性:item-number,pa,da,mozrank,backlinks,refer-domains,tf,cf。

非常感谢帮助:)

编辑:表格结构

wp_terms

  • term_id
  • 名称

wp_term_taxonomy

  • term_taxonomy_id
  • term_id
  • 分类

wp_term_relationships

  • 的object_id
  • term_taxonomy_id

wp_postmeta

  • POST_ID
  • meta_id
  • meta_key
  • meta_value

2 个答案:

答案 0 :(得分:2)

我建议您将INNER JOIN更改为LEFT JOIN。如果表格中没有任何内容匹配,INNER JOIN会删除行。

您可能还想用括号重新制作ON条款,如下所示:

 INNER JOIN wp_term_taxonomy ttpa 
     ON (    ttpa.taxonomy='pa_pa' 
         AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id)

修改

GROUP BY条款的用途是什么?您正在使用一个令人困惑的非标准MySQL扩展GROUP BY。阅读本文并理解它,或摆脱GROUP BYhttp://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html说真的。

看来,您的查询中有三件事情正在发生。如果我们有任何机会对这件事进行故障排除,我们需要仔细分解这些东西。让我们使用结构化查询语言中的结构化来使其正常工作。

首先,您尝试获取包含特定帖子的结果集(在您的情况下,包含待售商品)。

SELECT p.id, p.post_title, p.guid
  FROM wp_posts p 
  WHERE p.post_status = 'publish' 
    AND post_type = 'product' 

此查询是否会产生适当的项目列表?它可能包含一些未定价的项目或其他类似的东西,但它至少应该包含列表中所需的所有项目。

其次,您正在尝试检索和显示产品帖子的分类信息(类别,关键字等)。这是一个提取这些内容的查询,我认为(我不了解你的应用程序的这一部分)。我认为你试图提出的分类标准有两个方面。这是典型的WordPress分类法查找毛球。其中之一是:

    SELECT tr.object_id AS id, 
           t.name       AS mozrank
      FROM wp_term_relationships AS tr  
INNER JOIN wp_term_taxonomy AS x 
             ON (x.taxonomy='pa_mozrank' 
            AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t 
             ON t.term_id=x.term_id 

测试此查询。对于在“pa_mozrank”分类中分类的每个帖子,它应该给出一行,显示该分类中的post id和mozrank值。确保此查询有效。如果没有,请弄明白。在你明白这一点并让它发挥作用之前不要继续。

同样可以查询从pa_pa层次结构获取值的查询。

    SELECT tr.object_id AS id, 
           t.name       AS pa
      FROM wp_term_relationships AS tr  
INNER JOIN wp_term_taxonomy AS x 
             ON (x.taxonomy='pa_pa' 
            AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t 
             ON t.term_id=x.term_id 

第三,您正在从post_meta检索特定属性。我们需要类似的帖子和价格,帖子和库存状态。再次,编写这些查询并单独调试它们。这是价格。

  SELECT post_id AS id, meta_value AS price
    FROM wp_postmeta
   WHERE meta_key = `_regular_price'

这是库存状态。

  SELECT post_id AS id, meta_value AS stockstatus
    FROM wp_postmeta
   WHERE meta_key = `_stock_status'

好:我们有五个调试的子查询。每个都在id上编入索引。

  1. 已发布的产品信息列表
  2. 包含pa_mozrank分类的所有帖子的列表。
  3. 包含其pa_pa分类的所有帖子的列表。
  4. 价。
  5. 放养状态。
  6. 现在我们需要将所有这些东西加在一起。这是我们最终查询的大致轮廓。大概你可以看到这与你的原始查询有什么关系。

       SELECT whatever
         FROM wp_posts      AS p
    LEFT JOIN (mozranks)    AS mo ON p.id = mo.id
    LEFT JOIN (pas)         AS pa ON p.id = pa.id
    LEFT JOIN (prices)      AS pr ON p.id = pr.id
    LEFT JOIN (stockstatus) AS ss ON p.id = ss.id
        WHERE p.post_status = 'publish' 
          AND p.post_type = 'product' 
          AND pr.price <> ''
          AND ss.stockstatus = 'instock'
    

    我们在这里使用LEFT JOIN因为我们仍然需要来自wp_posts表的东西,即使它缺少部分或全部属性。

    最后,把它们放在一起,我们得到了一个巨大的查询。但是我们得到一个查询,其中所有部分都经过了单元测试。那么,我们不必砸我们的额头并说WTF? WTF?在创建查询的这个阶段。

       SELECT whatever
         FROM wp_posts      AS p
    LEFT JOIN (
                SELECT tr.object_id AS id, 
                       t.name       AS mozrank
                  FROM wp_term_relationships AS tr  
            INNER JOIN wp_term_taxonomy AS x 
                         ON (x.taxonomy='pa_mozrank' 
                        AND x.term_taxonomy_id=tr.term_taxonomy_id)
            INNER JOIN wp_terms AS t 
                         ON t.term_id=x.term_id    
              ) AS mo ON p.id = mo.id
    LEFT JOIN (
                SELECT tr.object_id AS id, 
                       t.name       AS pa
                  FROM wp_term_relationships AS tr  
            INNER JOIN wp_term_taxonomy AS x 
                         ON (x.taxonomy='pa_pa' 
                        AND x.term_taxonomy_id=tr.term_taxonomy_id)
            INNER JOIN wp_terms AS t 
                         ON t.term_id=x.term_id 
              ) AS pa ON p.id = pa.id
    LEFT JOIN (
               SELECT post_id AS id, meta_value AS price
                 FROM wp_postmeta
                WHERE meta_key = `_regular_price'
              ) AS pr ON p.id = pr.id
    LEFT JOIN (
               SELECT post_id AS id, meta_value AS stockstatus
                 FROM wp_postmeta
                WHERE meta_key = `_stock_status'
              ) AS ss ON p.id = ss.id
        WHERE p.post_status = 'publish' 
          AND p.post_type = 'product' 
          AND pr.price <> ''
          AND ss.stockstatus = 'instock'
    

    这是一个很长的查询,但你可以很容易地看到它是如何组合在一起的,你可以逐个调试这些部分。

    查询优化器旨在使这些东西尽可能高效,所以你不必担心,除非你有数百万件待售物品,在这种情况下你可能是亚马逊无论如何.com。

    如果您是为大公司执行此操作的企业开发人员,则可以对子查询使用SQL视图。 (如果您使用的是Oracle或PostgreSQL,则可以在查询中使用WITH子句。)您甚至可以在WordPress中执行此操作,但您可能希望编写一个在激活和取消激活时创建和删除它们的插件。只使用大型SQL查询可能会更容易。

答案 1 :(得分:0)

您有太多的连接,这会增加您的加载时间。.请像我一样做。.

SELECT 
                p1.ID as id,
                p1.post_title as title,
                p1.post_content as description,
                p1.guid as link,
                (CASE WHEN pm1.meta_key = '_thumbnail_id' then p2.guid ELSE NULL END) as image_​​link,
                (CASE WHEN pm1.meta_key = '_stock_status' then pm1.meta_value ELSE NULL END) as availability,
                (CASE WHEN pm1.meta_key = '_sale_price' then pm1.meta_value ELSE NULL END) as sales_price,
                (CASE WHEN pm1.meta_key = '_price' then pm1.meta_value ELSE NULL END) as price,
                (CASE WHEN pm1.meta_key = '_regular_price' then pm1.meta_value ELSE NULL END) as regular_price
            FROM
                wp_posts p1
            LEFT JOIN
                wp_postmeta pm1
                ON (
                    pm1.post_id = p1.ID               
                ) 
            LEFT JOIN 
                wp_posts p2
                ON (
                    pm1.post_id = p2.ID 
                )
            WHERE 
                p1.post_type IN ('product','product_variation')
            AND
                p1.post_status = 'publish'
            GROUP BY p1.ID