首页 > 解决方案 > 如何在 MYSQL 中计算 WordPress order_itemmeta 的产品 _qty 的 SUM()

问题描述

我有如此复杂的 MySQL 查询:

SELECT im.order_item_id, im.meta_key, im.meta_value
FROM `wp_woocommerce_order_itemmeta` AS im
JOIN `wp_woocommerce_order_items` AS oi
ON oi.order_item_id = im.order_item_id
JOIN `wp_posts` AS p
ON p.ID = oi.order_id
WHERE oi.order_id IN (
    SELECT DISTINCT order_id
    FROM wp_tss_orders_history
    WHERE created BETWEEN 1477880000 AND 1689198400
)
AND im.meta_key IN ("_product_id", "_qty")
AND p.post_status <> "trash"
AND oi.order_item_type = "line_item"
ORDER BY im.order_item_id ASC

返回这样的结果: 查询结果

有什么方法可以修改我的查询 (GROUP BY + SUM()) 以获得这种格式的结果:

array(
  array('_product_id' => 178, '_qty' => 150),
  array('_product_id' => 177, '_qty' => 20),
  array('_product_id' => some other ID, '_qty' => Number Of Items Sold),
)

我已经在 PHP 上编写了解决方案:

$result = $wpdb->get_results($query);
$stage1= [];
foreach ($result as $data) {
    $stage1[$data->order_item_id][$data->meta_key] = $data->meta_value;
}
$products_count = [];
foreach ($stage1 as $info) {
    $products_count[$info['_product_id']] += intval($info['_qty']);
}

此代码返回:

Array (
   [178] => 634
   [177] => 135
   // where key: _product_id => value: sum of _qty for this _product_id
   ...
)

但是欢迎任何关于 MySQL 解决方案的想法。谢谢!

标签: phpmysqlwordpressgroup-by

解决方案


好吧,至少对我来说,在尝试添加一些示例时,所有其他过滤器都可以忽略不计,因为结果示例所需的所有数据都已经在wp_woocommerce_order_itemmeta. 据我在您的问题中看到的,您希望获取所有订单商品的 product_id 总量。

我还没有对此进行测试,但你需要的可能看起来像这样:

SELECT metamain.meta_value as product_id,
(
    SELECT SUM(metasub.meta_value) FROM wp_woocommerce_order_itemmeta as metasub
        LEFT JOIN wp_woocommere_order_itemmeta as metajoin 
            ON metajoin.order_item_id=metasub.order_item_id AND metajoin.meta_key='_product_id'
        WHERE metasub.meta_key='_qty' AND metajoin.meta_value=metamain.meta_value
) as qty_sum
 FROM wp_woocommerce_order_itemmeta as metamain 

WHERE metamain.meta_key='_product_id' GROUP BY metamain.meta_value;

好吧,就像我写的那样,我还没有测试这个查询,它仍然可以进行很多优化。首先,由于这个巨大的子选择,它需要长时间才能完成,所以如果你想要更多,不要像这样使用它,然后手动运行它来获得结果。


推荐阅读