过去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
wp_term_taxonomy
wp_term_relationships
wp_postmeta
答案 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 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值。确保此查询有效。如果没有,请弄明白。在你明白这一点并让它发挥作用之前不要继续。
同样可以查询从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
上编入索引。
现在我们需要将所有这些东西加在一起。这是我们最终查询的大致轮廓。大概你可以看到这与你的原始查询有什么关系。
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