使用 SQL 获取已购买商品的数量 - Woocommerce
Posted
技术标签:
【中文标题】使用 SQL 获取已购买商品的数量 - Woocommerce【英文标题】:Getting number of purchased items using SQL - Woocommerce 【发布时间】:2021-04-20 12:17:58 【问题描述】:我被困在这个查询中一段时间,任何类型的帮助都将不胜感激。这是一个使用 woocommerce 的 wordpress 网站。
试图获取客户的购买详细信息,我需要获取一个应包含以下字段的结果集。
Email | First Name | Orders | Items Purchased | Order Total
为此,我编写了以下 SQL。 achg8 是表前缀。一个订单可能有一个或多个项目。
SELECT
pm1.meta_value as email ,
pm2.meta_value as first_name,
sum(pm3.meta_value) as total,
count(posts.ID) as orders ,
count(items.order_item_id) as items
from achg8_posts as posts
left join achg8_postmeta as pm1 on posts.ID = pm1.post_id
left join achg8_postmeta as pm2 on posts.ID = pm2.post_id
left join achg8_postmeta as pm3 on posts.ID = pm3.post_id
left join achg8_woocommerce_order_items as items on items.order_id = posts.ID
WHERE
posts.post_type = 'shop_order' and
posts.post_status = 'wc-processing' and
pm1.meta_key='_billing_email' and
pm2.meta_key='_billing_first_name' and
pm3.meta_key='_order_total'
GROUP by email
问题是订单号和项目号总是相等的。但实际上并非如此。
需要并了解我做错了什么。
更新
根据@matigo 的评论将 sql 编辑为以下内容。现在的问题是订单总数被多次相加。例如,如果一个订单有两个项目(即连接结果集中的两行),订单总数被相加两次。
SELECT
pm1.meta_value as email ,
pm2.meta_value as first_name,
sum(pm3.meta_value) as total,
count(DISTINCT posts.ID) as orders ,
count(items.order_item_id) as items
from achg8_posts as posts
left join achg8_postmeta as pm1 on posts.ID = pm1.post_id
left join achg8_postmeta as pm2 on posts.ID = pm2.post_id
left join achg8_postmeta as pm3 on posts.ID = pm3.post_id
left join achg8_woocommerce_order_items as items on items.order_id = posts.ID
WHERE
posts.post_type = 'shop_order' and
posts.post_status = 'wc-processing' and
pm1.meta_key='_billing_email' and
pm2.meta_key='_billing_first_name' and
pm3.meta_key='_order_total'
GROUP by email
【问题讨论】:
您能否展示一下包含在此事务中的表的架构,并提及您希望如何聚合结果集。 @DashrathChauhan 你来了,伙计screencast.com/t/TDTIRNo7。我想通过客户电子邮件汇总订单。应该有订单的总价值和购买的商品总数 【参考方案1】:你可以试试这个,看看它是否有效。
对不起,我删除了那个连接,没有考虑与 meta_key 的关系,你可以试试这个。
SELECT
pm1.`meta_value` as `email`,
pm2.`meta_value` as `first_name`,
SUM(pm3.`meta_value`) as `total`,
COUNT(distinct posts.`ID`) as `orders`,
COUNT(distinct items.order_item_id) as `items`
FROM `achg8_posts` posts
INNER JOIN `achg8_postmeta` pm1 ON posts.`ID` = pm1.`post_id`
INNER JOIN `achg8_postmeta` pm2 ON posts.`ID` = pm2.`post_id`
INNER JOIN `achg8_postmeta` pm3 ON posts.`ID` = pm3.`post_id`
INNER JOIN achg8_woocommerce_order_items as items on items.order_id = posts.ID
WHERE
posts.`post_type` = 'shop_order' and
posts.`post_status` = 'wc-processing' and
pm1.`meta_key` = '_billing_email' and
pm2.`meta_key` = '_billing_first_name' and
pm3.`meta_key` = '_order_total'
GROUP by `email`
【讨论】:
不,伙计,我得到了这个screencast.com/t/MKZQ6caBt的非常奇怪的结果集@ 结果和之前的一样。 (在原始问题中)【参考方案2】:假设同一订单号可以多次出现在items
中,您的COUNT
中似乎需要一个DISTINCT
。
试试这个:
SELECT pm1.`meta_value` as `email`,
pm2.`meta_value` as `first_name`,
SUM(pm3.`meta_value`) as `total`,
COUNT(posts.`ID`) as `orders`,
(SELECT COUNT(z.`order_item_id`)
FROM `achg8_woocommerce_order_items` z
WHERE posts.`ID` = z.`order_id`) as `items`
FROM `achg8_posts` posts INNER JOIN `achg8_postmeta` pm1 ON posts.`ID` = pm1.`post_id`
INNER JOIN `achg8_postmeta` pm2 ON posts.`ID` = pm2.`post_id`
INNER JOIN `achg8_postmeta` pm3 ON posts.`ID` = pm3.`post_id`
WHERE posts.`post_type` = 'shop_order'
and posts.`post_status` = 'wc-processing'
and pm1.`meta_key` = '_billing_email'
and pm2.`meta_key` = '_billing_first_name'
and pm3.`meta_key` = '_order_total'
GROUP by `email`, `first_name`
这应该会给你你想要的东西??
【讨论】:
这正是问题所在。但现在订单总数似乎翻了一番。例如,如果订单有两个项目(即连接中的两行),sql 会将订单总数加起来两次。我该如何减轻这种情况? 问题是achg8_woocommerce_order_items
,它有点搞砸了。这可以通过将其移动到内联查询中来解决,但如果您返回 数千 个订单的数据,您会注意到性能下降 ...
此查询中的项目数也有误screencast.com/t/d1DzUNFaR以上是关于使用 SQL 获取已购买商品的数量 - Woocommerce的主要内容,如果未能解决你的问题,请参考以下文章