首页 文章

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

提问于
浏览
1

我最近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 .

帮助将非常感谢:)

Edit: Table Structure

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

1 回答

  • 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 BY . http://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值 . 确保此查询有效 . 如果没有,请弄明白 . 在你明白这个并让它运作之前不要继续 .

    同上ditto用于查询以从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 上编入索引 .

    • 已发布产品的列表

    • 所有帖子的列表及其pa_mozrank分类 .

    • 包含其pa_pa分类的所有帖子的列表 .

    • 价格 .

    • 放养状态 .

    现在我们需要将所有这些东西加在一起 . 这是我们最终查询的大致轮廓 . 大概你可以看到这与你的原始查询有什么关系 .

    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'
    

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

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

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

相关问题