使用 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的主要内容,如果未能解决你的问题,请参考以下文章

用js实现商品购买数量越多,商品单价越低,并计算总价?

C++实现:编写商品销售统计程序。

SQL Server 2008 R2-查询以获取按月销售的总销售额和数量

商品规格选择弹窗设计总结

商城商品购买数量增减的完美JS效果

vue-购物车