我最近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 回答
我建议你把你的
INNER JOIN
改为LEFT JOIN
. 如果表中的任何内容与连接的左侧没有匹配,INNER JOIN
将删除行 .您可能还想用括号重新构造
ON
子句,如下所示:编辑
GROUP BY
条款的目的是什么?您正在使用一个令人困惑的非标准MySQL扩展GROUP BY
. 阅读本文并理解它,或摆脱GROUP BY
. http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html说真的 .看来,你的查询中有三件事情正在发生 . 如果我们有任何机会对这件事进行故障排除,我们需要仔细分解这些东西 . 让我们使用结构化查询语言中的结构化来使其正常工作 .
首先,您正在尝试获取包含特定帖子的结果集(在您的情况下,包含待售商品) .
此查询是否会生成适当的项目列表?它可能包含一些未定价的项目或其他类似的东西,但它至少应该包含列表中所需的所有项目 .
其次,您正在尝试检索和显示产品帖子的分类信息(类别,关键字等) . 这是一个提取这些内容的查询,我认为(我不了解你的应用程序的这一部分) . 我认为你试图提出的分类标准有两个方面 . 这是典型的WordPress分类法查找毛球 . 其中之一就是:
测试此查询 . 对于在“pa_mozrank”分类中分类的每个帖子,它应该给出一行,显示该分类中的post id和mozrank值 . 确保此查询有效 . 如果没有,请弄明白 . 在你明白这个并让它运作之前不要继续 .
同上ditto用于查询以从pa_pa层次结构中获取值 .
第三,您正在从
post_meta
检索特定属性 . 我们需要类似的帖子和价格,帖子和库存状态 . 再次,编写这些查询并单独调试它们 . 这是价格 .这是库存状态 .
好:我们有五个调试的子查询 . 每个都在
id
上编入索引 .已发布产品的列表
所有帖子的列表及其pa_mozrank分类 .
包含其pa_pa分类的所有帖子的列表 .
价格 .
放养状态 .
现在我们需要将所有这些东西加在一起 . 这是我们最终查询的大致轮廓 . 大概你可以看到这与你的原始查询有什么关系 .
我们在这里使用LEFT JOIN因为我们仍然需要来自wp_posts表的东西,即使它缺少部分或全部属性 .
最后,把它们放在一起,我们得到了一个巨大的查询 . 但是我们得到一个查询,其中所有部分都经过了单元测试 . 那么,我们不必砸我们的额头并说WTF? WTF?在创建查询的这个阶段 .
这是一个很长的查询,但你可以很容易地看到它是如何组合在一起的,你可以逐个调试这些部分 .
查询优化器旨在使这些东西尽可能高效,所以你不必担心,除非你有数百万件待售物品,在这种情况下你可能是amazon.com .
如果您是为大公司执行此操作的企业开发人员,则可以将SQL视图用于子查询 . (如果您使用的是Oracle或PostgreSQL,则可以在查询中使用
WITH
子句 . )您甚至可以在WordPress中执行此操作,但您可能希望编写一个在激活和停用时创建和删除它们的插件 . 只使用大型SQL查询可能会更容易 .