You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:26