如何编写SQL查询筛选未在当前站点WooCommerce下单的用户?
筛选WooCommerce从未下单的用户SQL查询
要获取站点中从未在WooCommerce下单的用户,你可以基于原查询的条件(筛选subscriber角色、指定客户元值),通过排除已有下单记录的用户实现反向查询,以下是两种可行写法:
方法1:使用NOT IN子查询(逻辑直观)
先获取所有符合条件的用户,再排除出现在订单关联记录里的用户:
SELECT u.* FROM {prefix}users u INNER JOIN {prefix}usermeta um1 ON u.ID = um1.user_id INNER JOIN {prefix}usermeta um2 ON u.ID = um2.user_id WHERE -- 筛选订阅者(subscriber)角色 um1.meta_key = '{prefix}capabilities' AND um1.meta_value LIKE '%subscriber%' -- 筛选指定客户名称的用户(对应原查询的meta_value条件) AND um2.meta_key = 'client-name' AND um2.meta_value = '%current_user_meta|client-name%' -- 排除所有有过下单记录的用户 AND u.ID NOT IN ( SELECT DISTINCT pm.meta_value FROM {prefix}posts p INNER JOIN {prefix}postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'shop_order' -- 限定为WooCommerce订单 AND p.post_status IN ('wc-completed', 'wc-processing', 'wc-on-hold') -- 可选:仅统计有效订单,可按需调整状态 AND pm.meta_key = '_customer_user' -- 订单关联的用户ID字段 ) GROUP BY u.ID;
方法2:使用LEFT JOIN(性能更优)
针对数据量较大的站点,这种写法效率更高,通过判断关联结果为空筛选从未下单的用户:
SELECT u.* FROM {prefix}users u INNER JOIN {prefix}usermeta um1 ON u.ID = um1.user_id INNER JOIN {prefix}usermeta um2 ON u.ID = um2.user_id LEFT JOIN ( -- 子查询获取所有有过下单记录的用户ID SELECT DISTINCT pm.meta_value AS user_id FROM {prefix}posts p INNER JOIN {prefix}postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing', 'wc-on-hold') AND pm.meta_key = '_customer_user' ) AS ordered_users ON u.ID = ordered_users.user_id WHERE um1.meta_key = '{prefix}capabilities' AND um1.meta_value LIKE '%subscriber%' AND um2.meta_key = 'client-name' AND um2.meta_value = '%current_user_meta|client-name%' AND ordered_users.user_id IS NULL -- 无匹配下单记录的用户 GROUP BY u.ID;
注意事项
- 替换SQL中的
{prefix}为你的WordPress数据库前缀(如默认的wp_)。 - 订单状态筛选可按需调整:若要包含取消/退款订单,可添加
'wc-cancelled'、'wc-refunded'到post_status列表;若只统计已完成订单,保留'wc-completed'即可。 - 原查询中
usermeta.meta_value = '%current_user_meta|client-name%'对应的meta_key假设为client-name,如果实际元数据键名不同,请替换为真实键名。
内容的提问来源于stack exchange,提问作者Ilham Mohomed
相关产品推荐
相关产品推荐

