Вопрос или проблема
Я в настоящее время пытаюсь получить всех пользователей из wp_users, у которых нет соответствующей записи ID в wp_usermeta (сопоставление по user_id).
У меня есть сайт с очень большой пользовательской базой, на котором в настоящее время есть тысячи спам-пользователей.
Следующий запрос не возвращает никаких записей:
SELECT * FROM wp_users
WHERE ID NOT IN (
SELECT user_id FROM wp_usermeta);
Я уже удалил плохие записи из таблицы meta, поэтому мне нужно сделать запрос, чтобы найти только записи без связанного ID в wp_users.
$user_query = new WP_User_Query( array ( 'orderby' => 'ID', 'order' => 'DESC' ) );
if ( ! empty( $user_query->results ) ) {
foreach ( $user_query->results as $user ) {
echo '<p>'. $user->ID . '</p>';
}
} else {
echo 'Пользователи не найдены.';
}
Ответ или решение
Для решения вашей задачи по извлечению всех пользователей из таблицы wp_users
, которые не имеют соответствующего user_id
в таблице wp_usermeta
, следует использовать SQL-запрос, который правильно интерпретирует условия для получения необходимых данных.
Проблема, с которой вы столкнулись, заключается в том, что ваш текущий запрос не возвращает ожидаемых результатов. Важно понимать, что SQL-запрос, который вы используете, корректен с точки зрения синтаксиса, но может не возвращать нужные данные, если в таблице wp_users
нет пользователей, соответствующих условиям запроса.
Вот несколько шагов, которые помогут вам улучшить ваш запрос и правильно получить нужные данные:
Шаг 1: Проверка вывода
Перед разработкой сложного запроса, убедитесь, что в базе данных действительно есть пользователи без соответствующих записей в таблице wp_usermeta
. Для этого можно выполнить простой запрос:
SELECT * FROM wp_users LIMIT 10;
Это позволит вам получить представление о структуре ваших таблиц и убедиться, что данные корректны.
Шаг 2: Основной запрос
Для извлечения всех пользователей из wp_users
, у которых нет соответствующего user_id
в wp_usermeta
, используется следующий SQL-запрос:
SELECT * FROM wp_users
WHERE ID NOT IN (
SELECT user_id FROM wp_usermeta
);
Этот запрос будет работать корректно, если в вашей базе данных имеются пользователи без записей в wp_usermeta
.
Альтернативный подход: Использование LEFT JOIN
Иногда использование LEFT JOIN
может быть более эффективным, особенно в больших базах данных. Следующий запрос возвращает всех пользователей из wp_users
и только тех пользователей, у которых отсутствует соответствующий user_id
в wp_usermeta
:
SELECT u.*
FROM wp_users u
LEFT JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.user_id IS NULL;
Шаг 3: Оптимизация запроса
Если ваша база данных действительно большая и может содержать множество записей, вы также можете рассмотреть индексацию колонок ID
в wp_users
и user_id
в wp_usermeta
, чтобы ускорить выполнение вашего запроса.
Заключение
После выполнения этих запросов вы должны увидеть список всех пользователей без соответствующих записей в wp_usermeta
. Если у вас все еще возникают проблемы с получением данных, рекомендуется дополнительно проверить целостность базы данных и провести очистку от поврежденных записей.
Если вам нужно использовать результаты запроса в PHP, применяя класс WP_User_Query
, следует учесть, что изначально WP_User_Query
не совсем подходящий для данной задачи, но если необходимо использовать его, вы можете сначала получить массив ID, а затем использовать его для фильтрации:
global $wpdb;
$ids_without_meta = $wpdb->get_col("SELECT ID FROM wp_users WHERE ID NOT IN (SELECT user_id FROM wp_usermeta)");
if (!empty($ids_without_meta)) {
$user_query = new WP_User_Query(array('include' => $ids_without_meta, 'orderby' => 'ID', 'order' => 'DESC'));
if (!empty($user_query->results)) {
foreach ($user_query->results as $user) {
echo '<p>' . $user->ID . '</p>';
}
} else {
echo 'Пользователи не найдены.';
}
} else {
echo 'Все пользователи имеют соответствующие записи в usermeta.';
}
Эта реализация обеспечит получение пользователей, которые не имеют записей в таблице метаданных.
SEO советы
При написании статей и ответов старайтесь использовать ключевые слова, такие как "WordPress", "SQL запрос", "wp_users", и "пользователи без метаданных", чтобы повысить видимость вашего контента в поисковых системах. Убедитесь, что ваша статья имеет четкий заголовок и метаописание, что поможет пользователям лучше понять содержание и привлекать аудиторию.