【问题标题】:Sql query to exclude meta_value where meta_key = x on SUM for WooCommerceSql 查询排除 meta_value where meta_key = x on SUM for WooCommerce
【发布时间】:2021-02-19 14:46:10
【问题描述】:

使用 Get orders total purchases amount for the day in Woocommerce 回答代码,返回 woocommerce 订单的总值,它工作正常,但问题是如果我想排除 _billing_first_name 键没有的所有订单 abc 值,就像在此代码尝试中一样:

global $wpdb;

return $wpdb->get_var( "
    SELECT DISTINCT SUM(pm.meta_value)
    FROM {$wpdb->prefix}posts as p
    INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
    WHERE p.post_type LIKE 'shop_order'
    AND p.post_status IN ('wc-processing','wc-completed')
    AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - (86400))
    AND pm.meta_key LIKE '_order_total'
    AND NOT (pm.meta_value = 'abc')
" );

我尝试了很多方法都没有运气,感谢任何帮助

【问题讨论】:

  • 有一种比你的答案更流畅的方式,见下文。
  • 只是观察一下,您极不可能(尽管并非不可能)故意将 DISTINCT 修饰符与聚合函数结合使用

标签: php mysql sql wordpress woocommerce


【解决方案1】:

您还可以对具有不同引用的同一个表使用 2 INNER JOIN,如下所示(以避免在您的答案中出现双重查询)

global $wpdb;

return $wpdb->get_var( "
    SELECT SUM(pm.meta_value)
    FROM {$wpdb->prefix}posts as p
    INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
    INNER JOIN {$wpdb->prefix}postmeta as pm2 ON p.ID = pm2.post_id
    WHERE p.post_type = 'shop_order'
    AND p.post_status IN ('wc-processing','wc-completed')
    AND pm.meta_key = '_order_total'
    AND pm2.meta_key = '_billing_first_name' 
    AND pm2.meta_value != 'abc'
" );

经过测试,运行更流畅。

【讨论】:

  • DISTINCT, LIKE 'shop_order', LIKE '_order_total', 所选列没有别名......虽然他们可能没有触及问题的核心,但这些让我觉得很粗心(除非你认为这是区分大小写的排序规则),你不觉得吗?
  • @Strawberry 是的,LIKE 两者都对你来说也是正确的……当你说 “所选列没有别名” 时,你是什么意思,我不是那么熟练。我对 WooCommerce 已经足够好了。
  • 好吧,当您选择一些数据时,很高兴能够在代码的其他地方引用该数据。 SUM(pm.meta_value) 尝试引用(通过关联)是一件很麻烦的事情,因此很容易提供别名,例如 AS total
  • @Strawberry 好的,我明白了,但在这里并不是很有用。谢谢。
【解决方案2】:

对于任何研究此问题的人,我所做的修复是:

global $wpdb;

return $wpdb->get_var( "
    SELECT DISTINCT SUM(pm.meta_value)
    FROM {$wpdb->prefix}posts as p
    INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
    WHERE p.post_type LIKE 'shop_order'
    AND p.post_status IN ('wc-processing','wc-completed')
    AND pm.meta_key LIKE '_order_total'
    AND pm.post_id not in(SELECT post_id from wp_postmeta WHERE meta_key = '_billing_first_name' AND meta_value ='abc' )
" );

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2023-04-04
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多