【问题标题】:Woocommerce: Get the total order value for each coupon use (SQL query)Woocommerce:获取每次使用优惠券的总订单价值(SQL 查询)
【发布时间】:2019-09-03 10:00:19
【问题描述】:

我正在使用以下问题https://stackoverflow.com/a/52852428/609630的答案

SELECT pc.post_title AS coupon_name,
       pc.post_excerpt AS coupon_description,
       Max(CASE WHEN pmc.meta_key = 'discount_type'      AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS discount_type,
       Max(CASE WHEN pmc.meta_key = 'coupon_amount'      AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS coupon_amount,
       Max(CASE WHEN pmc.meta_key = 'product_ids'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS product_ids,
       Max(CASE WHEN pmc.meta_key = 'product_categories' AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS product_categories,
       Max(CASE WHEN pmc.meta_key = 'customer_email'     AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS customer_email,
       Max(CASE WHEN pmc.meta_key = 'usage_limit'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS usage_limit,
       Max(CASE WHEN pmc.meta_key = 'usage_count'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS total_usaged,
       po.ID AS order_id,
       MAX(CASE WHEN pmo.meta_key = '_billing_email'      AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_email,
       MAX(CASE WHEN pmo.meta_key = '_billing_first_name' AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_first_name,
       MAX(CASE WHEN pmo.meta_key = '_billing_last_name'  AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_last_name,
       MAX(CASE WHEN pmo.meta_key = '_order_total'        AND po.ID = pmo.post_id THEN pmo.meta_value END) AS order_total
FROM `wp_posts` AS pc
INNER JOIN `wp_postmeta` AS pmc ON  pc.`ID` = pmc.`post_id`
INNER JOIN `wp_woocommerce_order_items` AS woi ON pc.post_title = woi.order_item_name
    AND woi.order_item_type = 'coupon'
INNER JOIN `wp_posts` AS po ON woi.order_id = po.ID
    AND po.post_type = 'shop_order'
    AND po.post_status IN ('wc-completed', 'wc-processing', 'wc-refunded') -- Added needed order status over here.
INNER JOIN `wp_postmeta` AS pmo ON po.ID = pmo.post_id
WHERE pc.post_type = 'shop_coupon'
GROUP BY po.ID
ORDER BY pc.ID DESC,
         po.ID DESC
LIMIT 0, 10 -- modify it accordingly.

但是当我尝试运行它时,我收到以下错误:

SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含 非聚合列“totm.pc.post_title”在功能上不起作用 依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by

错误代码 1055。

我该如何纠正它?答案被标记为正确,但我收到了上面的错误。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    选择列表中存在的所有非聚合列都必须出现在 GROUP BY 子句中。您收到此错误,因为您在选择列表中使用了一些非聚合列,但未在 group by 子句中使用它们。试试下面的查询 -

    SELECT pc.post_title AS coupon_name,
           pc.post_excerpt AS coupon_description,
           Max(CASE WHEN pmc.meta_key = 'discount_type'      AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS discount_type,
           Max(CASE WHEN pmc.meta_key = 'coupon_amount'      AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS coupon_amount,
           Max(CASE WHEN pmc.meta_key = 'product_ids'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS product_ids,
           Max(CASE WHEN pmc.meta_key = 'product_categories' AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS product_categories,
           Max(CASE WHEN pmc.meta_key = 'customer_email'     AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS customer_email,
           Max(CASE WHEN pmc.meta_key = 'usage_limit'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS usage_limit,
           Max(CASE WHEN pmc.meta_key = 'usage_count'        AND  pc.`ID` = pmc.`post_id` THEN pmc.`meta_value` END) AS total_usaged,
           po.ID AS order_id,
           MAX(CASE WHEN pmo.meta_key = '_billing_email'      AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_email,
           MAX(CASE WHEN pmo.meta_key = '_billing_first_name' AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_first_name,
           MAX(CASE WHEN pmo.meta_key = '_billing_last_name'  AND po.ID = pmo.post_id THEN pmo.meta_value END) AS billing_last_name,
           MAX(CASE WHEN pmo.meta_key = '_order_total'        AND po.ID = pmo.post_id THEN pmo.meta_value END) AS order_total
    FROM `wp_posts` AS pc
    INNER JOIN `wp_postmeta` AS pmc ON  pc.`ID` = pmc.`post_id`
    INNER JOIN `wp_woocommerce_order_items` AS woi ON pc.post_title = woi.order_item_name
        AND woi.order_item_type = 'coupon'
    INNER JOIN `wp_posts` AS po ON woi.order_id = po.ID
        AND po.post_type = 'shop_order'
        AND po.post_status IN ('wc-completed', 'wc-processing', 'wc-refunded') -- Added needed order status over here.
    INNER JOIN `wp_postmeta` AS pmo ON po.ID = pmo.post_id
    WHERE pc.post_type = 'shop_coupon'
    GROUP BY pc.post_title,
             pc.post_excerpt,
             po.ID
    ORDER BY po.ID DESC
    LIMIT 0, 10
    

    【讨论】:

    • 我在使用你的代码时仍然遇到同样的错误
    • 你确定你在使用这个查询吗?这个错误不应该存在,因为所有非聚合列现在都在 group by 子句中。
    • ORDER BY 子句的表达式#1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“totm.pc.ID”;这与 sql_mode=only_full_group_by 不兼容
    • select 子句中没有 pc.ID,因此出现了问题。我现在已经删除了。请尝试编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2015-05-14
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多