PHPmyAdmin 中 WordPress/WooCommerce 的 SQL 查询以选择垃圾邮件用户

Zac*_*ous 3 mysql wordpress woocommerce

我有一个 WordPress 数据库,其中大约有 28000 个垃圾邮件用户注册,我需要如何在不删除任何实际客户的情况下隔离和删除这些注册。

我注意到所有垃圾邮件用户注册都有一个空的meta_value特定meta_key

有问题的元密钥是billing_first_name

因此,我试图编写一个可以在 PHPmyAdmin 中执行的查询,该查询将返回具有空meta_value的所有用户 ID 的列表,以便我可以从_表和表中删除所有这些用户。meta_key billing_first_nameusermeta_users

我在网上发现一个用户有类似的问题:https://wordpress.org/support/topic/deleting-spam-user-accounts-from-site-with-woocommerce

他编写了以下查询,我尝试在我的数据库上运行该查询:

SELECT * FROM wp_usermeta JOIN wp_users ON (wp_usermeta.user_id = wp_users.ID) WHERE user_id NOT IN (SELECT um1.user_id FROM wp_usermeta um1 WHERE um1.meta_key = 'shipping_first_name')
Run Code Online (Sandbox Code Playgroud)

然而,它只返回 137 个结果,并且注册后,但实际订单只有 1000 左右,我的数据库比数据库中的帐户28000+ plus多得多。137 spam

我尝试过调整查询以扩展它并让它执行我想要的操作,但我并不是真正的“数据库”人员,而且运气不佳。

我的尝试是:

SELECT * FROM wv5_usermeta JOIN wv5_users ON (wv5_usermeta.user_id = wv5_users.ID) WHERE user_id NOT IN (SELECT um1.user_id FROM wv5_usermeta um1 WHERE um1.meta_key = 'billing_first_name' AND um1.meta_value IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我制定一个可以使用的工作查询吗?

请注意,我的尝试是基于我在网上找到的查询,我不知道这是否是正确的方法。

我的最终目标是识别所有从未下过任何订单的用户。未下订单的用户没有设置帐单地址或送货地址。因此,我尝试构建一个查询,选择帐单地址或送货地址为空的用户,然后将其删除。

非常感谢您提供的任何帮助。

编辑:

需要澄清的是,该网站的用户是 WooCommerce,因此数据库中没有特定的订单表。元键(例如“billing_first_name”、“shipping_first_name”等)仅在用户第一次下订单后才会填充值。因此,假设垃圾邮件用户从未下过订单,因此这些meta_keys将为空。

Ale*_*lex 5

只是根据这篇文章的猜测woocommerce 将订单存储在posts表格中post_type = 'shop_order'

所以你可以尝试这个查询:

SELECT u.* FROM wv5_users u
LEFT JOIN wv5_posts p
ON  u.ID = p.post_author
  AND p.post_type = 'shop_order'
GROUP BY u.ID
HAVING COUNT(p.id)=0
Run Code Online (Sandbox Code Playgroud)

它应该返回从未发过任何帖子的用户列表post_type = 'shop_order'。也许您应该检查您的 woocommerce 使用的具体内容post_type

如果您打算删除所有这些用户,请务必小心。其中一些可能是您的管理员。

编辑抱歉,我没有安装 wordpress 和 woocommerce。因为我的查询没有帮助。让我们尝试按照你的方式走,但稍微正确一些:

SELECT u.* FROM wv5_users u
LEFT JOIN wv5_usermeta m
ON  u.ID = m.user_id
  AND m.meta_key = 'shipping_first_name'
GROUP BY u.ID
HAVING COUNT(m.id)=0
Run Code Online (Sandbox Code Playgroud)

或者根据这个

HAVING COUNT(m.umeta_id)=0
Run Code Online (Sandbox Code Playgroud)