wpdb get_results() возвращает только 2 строки

Вопрос или проблема

Я пытаюсь создать пользовательский администраторский виджет, чтобы показать, сколько пользователей зарегистрировались за последние дни. Я создал функцию, представленную ниже:

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 может возвращать неправильные результаты

  1. Данные в базе: Убедитесь, что у вас в таблице wp_users действительно есть записи, соответствующие вашим ожиданиям. Сделайте простой запрос без группировки и посмотрите, сколько дат у вас в таблице.

  2. Группировка по дате: Использование функции DATE() в GROUP BY может иногда не работать так, как ожидается. Если в вашей базе данных есть пользователи, зарегистрированные в одно и то же время в один и тот же день, и они могут быть сгруппированы вместе, из-за чего вы видите только несколько строк.

Рекомендованное решение

Чтобы улучшить ваш запрос и получить более точные результаты, я рекомендую внести несколько изменений:

  1. Попробуйте использовать функцию 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)) для получения более подробной информации о пользователях, зарегистрированных в одно и то же время.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...