【问题标题】:SQL Select Query for Retrieving WooCommerce Order Items and Meta Data用于检索 WooCommerce 订单项目和元数据的 SQL 选择查询
【发布时间】:2016-12-09 03:22:44
【问题描述】:

我正在为我的 Wordpress 数据库创建一些 SQL 视图,以便更轻松地查看通过 WooCommerce 插件生成的在线订单。我熟悉 WooCommerce 结构和数据存储位置,但作为 SQL 新手,我被困在最后一道障碍中。

我已经能够使用此参考创建所有订单详细信息的第一个视图:

http://codecharismatic.com/sql-script-to-get-all-woocommerce-orders-including-metadata/

现在我需要为每个订单创建一个类似的订单项视图。有 2 个表存储订单项目的详细信息:

wp_woocommerce_order_items wp_woocommerce_order_itemmeta

我已经能够从 wp_woocommerce_order_items 表中创建基本的记录列表,如下所示:

SELECT order_item_id,order_item_name,order_item_type,order_id
FROM ocm_woocommerce_order_items 
ORDER BY order_id

这会返回一个很好的记录列表,如下所示:

order_item_id   order_item_name order_item_type order_id
 2  Widgets line_item   9
 3  Widgets line_item   10
 4  Widgets line_item   11
 5  Woo Logo    line_item   473
 6  Woo Logo    line_item   473

我现在想为 wp_woocommerce_order_itemmeta 表中的每个订单项添加额外的列。此表包含每个行项目的多条记录,如下所示:

 meta_id    order_item_id   meta_key    meta_value
 136    16  _qty    4
 137    16  _tax_class  
 138    16  _product_id 87
 139    16  _variation_id   0
 140    16  _line_subtotal  36
 141    16  _line_total 36
 142    16  _line_subtotal_tax  3.6
 143    16  _line_tax   3.6

我想将其中的每一个都转换成一个新列,这样我的输出将包括:

 order_item_id, order_item_name, order_item_type, order_id, qty, tax_class, product_id, variation_id, line_subtotal, line_total, line_subtotal_tax, line_tax

我不确定在此处使用哪种 SQL 语法 - 我尝试使用与上述链接类似的语法,但到目前为止还未能使其正常工作,并且不确定这是否确实正确语法。

【问题讨论】:

    标签: mysql wordpress woocommerce


    【解决方案1】:

    我设法通过反复试验解决了这个问题。这是最终起作用的查询:

    select
    p.order_id,
    p.order_item_id,
    p.order_item_name,
    p.order_item_type,
    max( CASE WHEN pm.meta_key = '_product_id' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as productID,
    max( CASE WHEN pm.meta_key = '_qty' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as Qty,
    max( CASE WHEN pm.meta_key = '_variation_id' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as variationID,
    max( CASE WHEN pm.meta_key = '_line_total' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as lineTotal,
    max( CASE WHEN pm.meta_key = '_line_subtotal_tax' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as subTotalTax,
    max( CASE WHEN pm.meta_key = '_line_tax' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as Tax,
    max( CASE WHEN pm.meta_key = '_tax_class' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as taxClass,
    max( CASE WHEN pm.meta_key = '_line_subtotal' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as subtotal
    from
    ocm_woocommerce_order_items as p,
    ocm_woocommerce_order_itemmeta as pm
     where order_item_type = 'line_item' and
     p.order_item_id = pm.order_item_id
     group by
    p.order_item_id
    

    【讨论】:

    • 谢谢。如何获得带有顶级字段的customer_id 字段?
    • 您需要查询订单本身,其中包含每个订单的 customer_id,因此您将直接查询wp_posts
    • 数量为空:/
    【解决方案2】:

    您可以使用此查询来获取所有已完成的订单,包括所有元数据。

    SELECT
            p.ID as order_id,
            p.post_date,
            max( CASE WHEN pm.meta_key = '_billing_email' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
            max( CASE WHEN pm.meta_key = '_billing_first_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
            max( CASE WHEN pm.meta_key = '_billing_last_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
            max( CASE WHEN pm.meta_key = '_billing_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_address_1,
            max( CASE WHEN pm.meta_key = '_billing_address_2' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_address_2,
            max( CASE WHEN pm.meta_key = '_billing_city' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
            max( CASE WHEN pm.meta_key = '_billing_state' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
            max( CASE WHEN pm.meta_key = '_billing_postcode' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_postcode,
            max( CASE WHEN pm.meta_key = '_shipping_first_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_first_name,
            max( CASE WHEN pm.meta_key = '_shipping_last_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_last_name,
            max( CASE WHEN pm.meta_key = '_shipping_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_address_1,
            max( CASE WHEN pm.meta_key = '_shipping_address_2' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_address_2,
            max( CASE WHEN pm.meta_key = '_shipping_city' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_city,
            max( CASE WHEN pm.meta_key = '_shipping_state' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_state,
            max( CASE WHEN pm.meta_key = '_shipping_postcode' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_postcode,
            max( CASE WHEN pm.meta_key = '_order_total' and p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
            max( CASE WHEN pm.meta_key = '_order_tax' and p.ID = pm.post_id THEN pm.meta_value END ) as order_tax,
            max( CASE WHEN pm.meta_key = '_paid_date' and p.ID = pm.post_id THEN pm.meta_value END ) as paid_date,
            ( select group_concat( order_item_name separator '|' ) from wp_woocommerce_order_items where order_id = p.ID ) as order_items
        FROM
            wp_posts p 
            join wp_postmeta pm on p.ID = pm.post_id
            join wp_woocommerce_order_items oi on p.ID = oi.order_id
        WHERE
            post_type = 'shop_order' and
            post_date BETWEEN '2021-07-01' AND '2021-08-01' and
            post_status = 'wc-completed'
        group by
            p.ID
    

    【讨论】:

    • 感谢分享 - 为获取当前正在处理的订单的产品,我们已经在这个问题上摆弄了一段时间!
    【解决方案3】:

    @mostafa Norzade 我没有评论权限,所以发布为答案

    user_id 的 meta_key 是 '_customer_user',所以只需添加以下内容: max( CASE WHEN pm.meta_key = '_customer_user ' and p.ID = pm.post_id THEN pm.meta_value END ) as customer_user,

    【讨论】:

    • 它不起作用..你能重写完整的查询吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多