Вопрос или проблема
Я пытаюсь создать пользовательский администраторский виджет, чтобы показать, сколько пользователей зарегистрировались за последние дни. Я создал функцию, представленную ниже:
function mdbootstrap_add_dashboard_recent_users(){
global $wpdb;
$query = "
SELECT count(*) as counter, DATE(wp_users.user_registered) as regdate
FROM wp_users
GROUP BY DATE(wp_users.user_registered)
ORDER BY DATE(wp_users.user_registered) desc";
$posts = $wpdb->get_results($query,OBJECT);
print_r( $posts);
}
Однако по какой-то причине она возвращает только 2 строки:
Array ( [0] => stdClass Object ( [counter] => 1 [regdate] => 2016-01-12 ) [1] => stdClass Object ( [counter] => 3 [regdate] => 2016-01-04 ) )
Кстати, она показывает некорректные значения, так как тот же запрос, выполненный из PHP MyAdmin, дает следующий результат:
- counter regdate
- 16 2016-01-13
- 37 2016-01-12
- 51 2016-01-11
- 25 2016-01-10
- 21 2016-01-09
- 26 2016-01-08
- 24 2016-01-07
- 24 2016-01-06
- 18 2016-01-05
- 20 2016-01-04
- 5 2016-01-03
Я искал подобную проблему, однако большинство тем касается случая с одной строкой, когда люди используют get_row
вместо get_results
. Я играл с разными параметрами, такими как ARRAY_N
, OBJECT
, ARRAY_A
, но это не сработало – запрос всегда возвращает 2 строки.
Вы можете попробовать следующий запрос
SELECT (
SELECT count(*)
FROM wp_users as temp
WHERE DATE(temp.user_registered) = DATE(wp_users.user_registered)
) as counter,
wp_users.*
FROM wp_users
Проблема может быть связана с тем, как используется функция DATE()
в операторе GROUP BY
и ORDER BY
. Когда вы используете DATE(wp_users.user_registered)
в этих операторах, записи могут не группироваться так, как ожидается. Вместо этого попробуйте использовать функцию DATE_FORMAT()
, чтобы отформатировать дату user_registered
таким образом, который будет совместим с GROUP BY
и ORDER BY
.
Попробуйте изменить ваш запрос на следующий код:
function mdbootstrap_add_dashboard_recent_users(){
global $wpdb;
$query = "SELECT COUNT(*) as counter, DATE_FORMAT(wp_users.user_registered, '%Y-%m-%d') as regdate
FROM wp_users
GROUP BY DATE_FORMAT(wp_users.user_registered, '%Y-%m-%d')
ORDER BY DATE_FORMAT(wp_users.user_registered, '%Y-%m-%d') DESC";
$posts = $wpdb->get_results($query, OBJECT);
// Вывод результатов для тестирования
foreach ($posts as $post) {
echo "Дата: " . $post->regdate . ", Количество: " . $post->counter . "<br>";
}
}
// Вызов функции
mdbootstrap_add_dashboard_recent_users();
.
Ответ или решение
Решение проблемы с возвратом 2 строк в результате запроса WPDB
Если вы столкнулись с ситуацией, когда функция wpdb->get_results()
возвращает только две строки вместо ожидаемого более полного списка, это может быть связано с несколькими факторами, связанными как с самим SQL-запросом, так и с тем, как данные хранятся в базе данных.
Анализ текущего запроса
Ваш исходный SQL-запрос выглядит следующим образом:
SELECT COUNT(*) as counter, DATE(wp_users.user_registered) AS regdate
FROM wp_users
GROUP BY DATE(wp_users.user_registered)
ORDER BY DATE(wp_users.user_registered) DESC
Как вы правильно отметили, данный запрос возвращает всего две строки, и вы видите, что значения счетчиков неверны. Это может быть связано с тем, как SQL обрабатывает ваш запрос.
Причины, по которым SQL может возвращать неправильные результаты
-
Данные в базе: Убедитесь, что у вас в таблице
wp_users
действительно есть записи, соответствующие вашим ожиданиям. Сделайте простой запрос без группировки и посмотрите, сколько дат у вас в таблице. -
Группировка по дате: Использование функции
DATE()
вGROUP BY
может иногда не работать так, как ожидается. Если в вашей базе данных есть пользователи, зарегистрированные в одно и то же время в один и тот же день, и они могут быть сгруппированы вместе, из-за чего вы видите только несколько строк.
Рекомендованное решение
Чтобы улучшить ваш запрос и получить более точные результаты, я рекомендую внести несколько изменений:
- Попробуйте использовать функцию
DATE_FORMAT()
, чтобы убедиться, что даты правильно обрабатываются.
Вот обновленная версия вашей функции:
function mdbootstrap_add_dashboard_recent_users() {
global $wpdb;
$query = "
SELECT COUNT(*) AS counter, DATE_FORMAT(wp_users.user_registered, '%Y-%m-%d') AS regdate
FROM wp_users
GROUP BY DATE_FORMAT(wp_users.user_registered, '%Y-%m-%d')
ORDER BY regdate DESC";
$posts = $wpdb->get_results($query, OBJECT);
// Вывод результатов для тестирования
foreach ($posts as $post) {
echo "Дата: " . $post->regdate . ", Количество: " . $post->counter . "<br>";
}
}
// Вызов функции
mdbootstrap_add_dashboard_recent_users();
Дополнительные шаги для диагностики
Если изменения в запросе не помогли, попробуйте выполнить следующие шаги:
- Проверьте данные в таблице
wp_users
на наличие более новых дат регистрации пользователей. - Выполните данный запрос в PHPMyAdmin, как вы уже делали, и убедитесь, что результаты совпадают с вашими ожиданиями.
- Также можно использовать
COUNT(*) OVER (PARTITION BY DATE(wp_users.user_registered))
для получения более подробной информации о пользователях, зарегистрированных в одно и то же время.
Заключение
Ваше первоначальное решение действительно имеет потенциал, и с небольшой доработкой и тщательной диагностикой данных в таблице, вы сможете получить точные результаты по количеству зарегистрированных пользователей за последние дни. Убедитесь, что в таблице есть достаточно данных для тестирования вашего запроса, и проверьте возможность дублирования записей. Направление, в котором вы движетесь, будет полезным, за счет чего можно улучшить общую производительность запроса и получить правильные результаты.