Mysql 基于动态日期范围的Post元数据查询
我希望修改默认的woocommerce Subscriptions by Product SQL查询,以仅反映在未来7天内具有meta key=\u schedule\u next\u payment和meta value的订阅的订阅产品计数。这样做的原因是我每周交付产品,并试图预测下周可能订购的所有产品 我添加了以下查询段Mysql 基于动态日期范围的Post元数据查询,mysql,wordpress,woocommerce,metadata,Mysql,Wordpress,Woocommerce,Metadata,我希望修改默认的woocommerce Subscriptions by Product SQL查询,以仅反映在未来7天内具有meta key=\u schedule\u next\u payment和meta value的订阅的订阅产品计数。这样做的原因是我每周交付产品,并试图预测下周可能订购的所有产品 我添加了以下查询段 LEFT JOIN ( SELECT * FROM {$wpdb->posts} as subscri
LEFT JOIN (
SELECT *
FROM {$wpdb->posts} as subscriptionjk
INNER JOIN {$wpdb->postmeta} AS postmeta
ON subscriptionjk.id = postmeta.post_id
WHERE postmeta.meta_key = '_schedule_next_payment'
AND postmeta.meta_value BETWEEN '2020-09-07 00:00:00' AND '2020-09-14 00:00:00'
在wcs report subscriptions by product类的默认woocommerce查询中,该查询生成subscriptions by product报告
"SELECT product.id as product_id,
product.post_parent as parent_product_id,
product.post_title as product_name,
mo.product_type,
COUNT(subscription_line_items.subscription_id) as subscription_count,
SUM(subscription_line_items.product_total) as recurring_total
FROM {$wpdb->posts} AS product
LEFT JOIN (
SELECT tr.object_id AS product_id, t.slug AS product_type
FROM {$wpdb->prefix}term_relationships AS tr
INNER JOIN {$wpdb->prefix}term_taxonomy AS x
ON ( x.taxonomy = 'product_type' AND x.term_taxonomy_id = tr.term_taxonomy_id )
INNER JOIN {$wpdb->prefix}terms AS t
ON t.term_id = x.term_id
) AS mo
ON product.id = mo.product_id
LEFT JOIN (
SELECT wcoitems.order_id as subscription_id, wcoimeta.meta_value as product_id, wcoimeta.order_item_id, wcoimeta2.meta_value as product_total
FROM {$wpdb->prefix}woocommerce_order_items AS wcoitems
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS wcoimeta
ON wcoimeta.order_item_id = wcoitems.order_item_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS wcoimeta2
ON wcoimeta2.order_item_id = wcoitems.order_item_id
WHERE wcoitems.order_item_type = 'line_item'
AND ( wcoimeta.meta_key = '_product_id' OR wcoimeta.meta_key = '_variation_id' )
AND wcoimeta2.meta_key = '_line_total'
) as subscription_line_items
ON product.id = subscription_line_items.product_id
LEFT JOIN (
SELECT *
FROM {$wpdb->posts} as subscriptionjk
INNER JOIN {$wpdb->postmeta} AS postmeta
ON subscriptionjk.id = postmeta.post_id
WHERE postmeta.meta_key = '_schedule_next_payment'
AND postmeta.meta_value BETWEEN '2020-09-07 00:00:00' AND '2020-09-14 00:00:00'
) as subscriptions
ON subscriptions.ID = subscription_line_items.subscription_id
WHERE product.post_status = 'publish'
AND ( product.post_type = 'product' OR product.post_type = 'product_variation' )
AND subscriptions.post_type = 'shop_subscription'
AND subscriptions.post_status NOT IN( 'wc-pending', 'trash' )
GROUP BY product.id
ORDER BY COUNT(subscription_line_items.subscription_id) DESC" );
有了这个功能,它就可以正常工作,并提供我想要的结果。然而,我已经尝试过使用堆栈溢出问题的指导,用一个BETWEEN函数替换那些硬编码的日期,并且使用不同的配置,我尝试过它不会产生任何结果
我试过这个:
AND postmeta.meta_value BETWEEN GETDATE() AND DATEADD(day, -7, GETDATE())
以下是有效的解决方案:
LEFT JOIN (
SELECT *
FROM {$wpdb->posts} as subscriptionjk
INNER JOIN {$wpdb->postmeta} AS postmeta
ON subscriptionjk.id = postmeta.post_id
WHERE postmeta.meta_key = '_schedule_next_payment'
AND postmeta.meta_value BETWEEN CURDATE() AND (CURDATE() + INTERVAL 7 DAY)
) as subscriptions
ON subscriptions.ID = subscription_line_items.subscription_id
顺便说一句,考虑到子查询中没有聚合,它们实际上不需要是子查询,并且您正在为mo.product_type.Hey@草莓返回一个任意(“不确定”)值,谢谢您的回复。我不知道如何运用你说的话。您的评论是对查询的一般性反馈,还是关于如何为元键添加所需过滤器的建议/相关?我更新了问题,使其更加具体,并反映了我编写的SQL查询的一个新部分,这也是我的一部分。一位朋友@Kirit Dholakiya帮助我解决了这个问题。下面是解决方案