SQL-запрос получить всех пользователей, кто сделал хотя бы один заказ

Я сейчас пишу скрипт по переносу пользователей с одного сайта на другой. Нужны пользователи, которые сделали хотя бы один заказ через интернет-магазин на WooCommerce.

Все пользователи по умолчанию хранятся в таблице wp-users. Но когда на сайте включена регистрация, то очень велик шанс, что зарегистрировано очень много ботов и прочих непонятных личностей. Для примера в текущем проекте на сайте-доноре 34 096 пользователей.

В таблице wp_usermeta можно найти все ключевые признаки активности пользователя интернет-магазина. WooCommerce сохраняет мета-ключи:

  • _order_count — количество заказов
  • _money_spent — сумма покупок
  • _last_order — ID последнего заказа
  • paying_customer — флаг: 1, если есть хотя бы один заказ не в статусе «Отменён«

Вот готовый SQL-запрос, который вернёт всех пользователей, у которых paying_customer = 1:

SELECT wp_users.*
FROM wp_users
JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE wp_usermeta.meta_key = 'paying_customer' AND wp_usermeta.meta_value = '1';

Мы получим список всех пользователей, которые сделали хотя бы один заказ не в статусе «Отменён«. В моем случае — это 2528.

Вот альтернатива: по _order_count > 0

SELECT wp_users.*
FROM wp_users
JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE wp_usermeta.meta_key = '_order_count' AND CAST(wp_usermeta.meta_value AS UNSIGNED) > 0;

Тут мы получаем всех пользователей, у которых есть хотя бы один заказ в любом статусе. В моем случае — это 2 973 пользователя. И я для себя выбрал этот вариант.

Ну и SQL-запрос для wp_usermeta

SELECT wp_usermeta.*
FROM wp_usermeta
JOIN wp_usermeta AS wp_usermeta_order_count 
    ON wp_usermeta.user_id = wp_usermeta_order_count.user_id
    AND wp_usermeta_order_count.meta_key = '_order_count'
WHERE CAST(wp_usermeta_order_count.meta_value AS UNSIGNED) > 0;

Итого от 34 096 пользователей у нас осталось 2 528 пользователя (примерно 9%), с данными которых я буду работать.