Mysql Задача: запрос для данных, которых нет в базе

grey109

Новичок
Привет всем!

Есть таблица с данными пользователей, в том числе с датой регистрации. Я хочу получить данные допустим за последний год, о том в какой день сколько зарегистрировалось людей. Просто сделать запрос типа "SELECT date_reg, COUNT(user_id) FROM users WHERE date_reg >= NOW() - INTERVAL 1 YEAR" не поможет, т.к. есть дни когда на сайте никто не регистрировался, соответственно запрос вернет только данные есть в таблице. Делать в цикле 365 запросов (типа SELECT COUNT(user_id) FROM users WHERE date_reg = '2022-01-23') к базе и смотреть на результат - тоже не хорошо.

Подскажите, есть ли красивое решение для данной задачи?

Спасибо!
 

Фанат

oncle terrible
Команда форума
сделать в пхп массив с датами, и выводить даты из него. дел на две минуты
 

grey109

Новичок
Это смахивает на колхоз какой-то. У меня сейчас тоже сделано тоже не айс:

$days = 123;

$result = mysqli_query ($sql, "select date_reg, count(user_id) from `users` WHERE date_reg >= NOW() - INTERVAL ".$days." DAY group by date_reg order by date_reg")

while (list ($date, $regs) = mysqli_fetch_row($result))
{
while ($date != $cur_day = date("d.m.Y", strtotime("-".$days--." day"))) echo "['".$cur_day."', 0],";

echo "['".$date."', ".$regs."],";
}

Я думал может можно как-то одними запросом к mysql обойтись...
 

Фанат

oncle terrible
Команда форума
так тут и нужен только один запрос
надо только забыть уже о помойной практике мешать SQL и HTML в одном флаконе, и результат запроса помещать сначала в массив, а потому уже этот массив выводить.

если разделить этот код на получение и вывод, то никакого колхоза не будет
 

weregod

unserializer
Я чо-то пэ, но там разве не
SQL:
GROUP BY по дате (или обрезку от даты-времени)
надо делать?
 

Valick

Новичок
При желании можно завести таблицу с датами и джойнить таблицы, но это должно быть нечто большее, чем простой вывод. Для обычного вывода как сказал Фанат, достаточно собрать массив диапазона дат на уровне РНР.
PHP:
function createDateRange($start, $end, $format = 'Y-m-d') {
    $dateList = [];
    $period = new DatePeriod(new DateTime($start), new DateInterval('P1D'), new DateTime($end));
    foreach ($period as $date) {
        $dateList[$date->format($format)] = 0;
    }
    return $dateList;
}
Потом получаем все значения из БД и соединяем с результатом работы функции.
 

WMix

герр M:)ller
Партнер клуба
Потом получаем все значения из БД и соединяем с результатом работы функции.
зачем? календарь это уже представление.
результат запроса собери так, чтоб с этими данными можно было легко работать (дырки с данными ничего общего не имеют)
Код:
$row['2020-12-12'] = ['date' => '2020-12-12', 'regs' => 42];
остальное уже на лету прям в twig или в js делать
завтра он csv захочет, модель заново писать?
 
Последнее редактирование:

Valick

Новичок
- Эй, горбатый...
- Я хромой!!!
- Нет, мужик, ты горбатый!

ТС задал конкретный вопрос, ему дали конкретный ответ. Специально прожал Ctrl + F и набрал слово "календарь", вдруг я слепой, но нет.
И я еще не видел ни одного массива который нельзя засунуть в twig, js или csv. Про модель вообще странно звучит.
 

WMix

герр M:)ller
Партнер клуба
конкретный вопрос:
Подскажите, есть ли красивое решение для данной задачи?
конкретный ответ
При желании можно завести таблицу с датами и джойнить таблицы, но это должно быть нечто большее, чем простой вывод. Для обычного вывода, достаточно собрать массив диапазона дат на уровне РНР.
так вот, это глупое решение.

Про модель вообще странно звучит.
как бы с точки зрения MVC модель это некая Collection<date_reg,count>
PHP:
$result = mysqli_query ($sql, "select date_reg, count(user_id) from `users` WHERE date_reg BETWEEN x AND y")
а Календарь, это представление, то что view называется, который ты искал "Ctrl + F" словами описан тут
Я хочу получить данные допустим за последний год, о том в какой день сколько зарегистрировалось людей.
...
есть дни когда на сайте никто не регистрировался, соответственно запрос вернет только данные есть в таблице
куда уже более конкретно
 
Сверху