【问题标题】:SQL Query for WordPress/WooCommerce in PHPmyAdmin to select spam usersPHPmyAdmin 中 WordPress/WooCommerce 的 SQL 查询以选择垃圾邮件用户
【发布时间】:2016-01-23 01:14:16
【问题描述】:

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

我注意到所有垃圾邮件用户注册对于特定的meta_key

都有一个空的meta_value

有问题的元密钥是billing_first_name

因此,我正在尝试编写一个可以在 PHPmyAdmin 中执行的查询,该查询将返回 meta_key 具有空 meta_value 的所有用户 ID 的列表billing_first_name 这样我就可以从 _usermeta 表和 _users 表中删除所有这些用户。 p>

我在网上找到了一个有类似问题的用户: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')

但是,它只返回 137 个结果,并且通过 28000+ plus 注册,但实际订单只有大约 1000 个,我在数据库中的帐户比 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)

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

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

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

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

编辑:

澄清一下,该网站用户是 WooCommerce,因此数据库中没有特定的订单表。诸如“billing_first_name”、“shipping_first_name”之类的元键只有在用户第一次下订单时才会填充一个值。因此,假设垃圾邮件用户永远不会下订单,因此这些 meta_keys 将为空。

【问题讨论】:

  • 您的真实用户和垃圾邮件用户分别是多少?你能算一算吗?
  • 一般元billing_first_nameorders几乎没有任何关系。因此,您应该更好地考虑什么是真正的标准。在您的数据库中应该有一个名为orders 的表,显示该表的架构。必须是简单的连接usersorders
  • 根据我的订单,我估计大约有 1000 个真实用户和 28500 个垃圾邮件用户。
  • @Alex 该网站使用 WooCommerce,并且没有特定的订单表。 billing_first_name 和类似 shipping_first_name 之类的 meta_keys 仅在客户第一次下订单时才会填充,因此假设所有垃圾邮件帐户从未下过订单,这意味着这将是空的。
  • AFAIK meta_keys 在表 post_meta 或类似的东西中。你应该更清楚地说明你在谈论 woocomerce

标签: mysql wordpress woocommerce


【解决方案1】:

根据this post 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

它应该返回从未有过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

或根据this

HAVING COUNT(m.umeta_id)=0

【讨论】:

  • 嗨,亚历克斯。我刚试过这个查询,但它说:#1054 - 'on 子句'中的未知列'wv5_users.ID'
  • @ZachNicodemous 哎呀......对不起我的错......我没有用我设置的别名替换表名,所以它应该是u.ID。检查更新的答案
  • OK 查询这次运行,但返回了除一对夫妇之外的所有用户。我查看了帖子表,所有帖子类型为“shop_order”的帖子都归于用户 ID 1,这是一个管理员,因此它几乎返回了该查询中的每个用户。
  • 它仍然返回所有用户。这是因为 WooCommerce 将所有订单都归于用户 ID 1(管理员),因此从类似查询的角度来看,该用户是唯一拥有“shop_order”帖子类型帖子的用户。
  • @ZachNicodemous 检查我的编辑,但我仍然不确定这是一个好方法。我相信这个列表应该通过posts 表。因为在你的情况下那是真实的order
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2013-01-31
相关资源
最近更新 更多