Как правильно составить запрос?

Arlevnar

Новичок
Столкнулся с сложностью при составлении запроса в MySQL.
Как можно одним запросом вывести количество регистраций за каждые 30 минут с определённым лимитом времени, то есть известна стартовая дата и конечная.
При этом не прибегая к PHP. Может кто нибудь сталкивался?
Честно говоря не каких мыслей помимо применения цикла в голову не приходит.
Скажем есть поле date - формат у него datetime.
Перевёл его в формат UNIX_TIMESTAMP а дальше и не знаю что да как.
SELECT COUNT(`user_id`) FROM `regs`
WHERE UNIX_TIMESTAMP(`reg_date`) >= '.$unix_min.'
AND UNIX_TIMESTAMP(`reg_date`) <= '.$unix_max
 

~WR~

Новичок
Оффтоп: в PostgreSQL как-то так.
PHP:
SELECT a.time, count(b.user_id)
FROM ( SELECT generate_series('$date_min'::timestamp, '$date_max'::timestamp, '30 minutes'::interval) AS time) a
    JOIN regs b ON (b.reg_date BETWEEN a.time AND a.time + interval '30 minutes')
GROUP BY a.time
ORDER BY a.time

Думаю, в MySQL принципиально так же будет работать. Нужно только найти способ динамически генерировать ряды с отсечками времени. Простого и понятного generate_series, насколько я знаю, там нет. :(
 

Dovg

Продвинутый новичок
Округляй метку времени до 30 минут в отдельном поле и делай группировку по нему.
 

Gas

может по одной?
+ GROUP BY FLOOR(UNIX_TIMESTAMP(`reg_date`) / (30 * 60))

в where не нужно делать UNIX_TIMESTAMP(`reg_date`) - так-как не будет использоваться индекс по этому полю (если он есть, конечно) и просто это лишняя операция для каждой строки, приведи $unix_min/$unix_max к формату datetime
 

~WR~

Новичок
Округляй метку времени до 30 минут в отдельном поле и делай группировку по нему.
А если в какой-то промежуток времени было 0 регистраций? Можно это как-то обработать в MySQL?
 

Arlevnar

Новичок
+ GROUP BY FLOOR(UNIX_TIMESTAMP(`reg_date`) / (30 * 60))

в where не нужно делать UNIX_TIMESTAMP(`reg_date`) - так-как не будет использоваться индекс по этому полю (если он есть, конечно) и просто это лишняя операция для каждой строки, приведи $unix_min/$unix_max к формату datetime
А плюс к чему?
 

Dovg

Продвинутый новичок
Спасибо выручил) Про GROUP BY я как раз и забыл)))
Не вариант. Я тоже в начале так хотел сделать. Этот вариант я оставил на последок если уже точно выхода не будет)
Т.е. когда написано по-русски, то это "не вариант", а когда дают готовое решение, то всё работает?
 

Gas

может по одной?
Dovg
думаю он просто тебя понял в том смысле, что нужно сделать ещё одно физическое поле с датой округлённой до 30 минут.

но вообще да, зря я сразу готовое решение дал.
 
Сверху