2013-09-13 6 views
3

У меня есть пользователи в db, которые я хочу отсортировать по часам и показать количество пользователей, зарегистрированных в этот час.Сортировка данных из базы MYSQL по часам

select 
    date_format(create_time, '%Y-%m-%d %h%p') as date, 
    count(id) as 'Number of registrations' 
from users 
group by 1 
order by 1 desc 
; 

Приведенный выше код будет работать; однако то, что я пытаюсь сделать, это показать 0 в течение часов, у которых нет регистрации пользователей. Например, если в 5 часов не было регистрации, это пропустит строку в течение 5 вечера, что является логичным. Есть ли способ достичь того, что я пытаюсь сделать?

+0

Я думаю, что вам нужно РЕГИСТРИРУЙТЕСЬ с самим собой. – Mihai

+0

Я не вижу, как это даст мне результаты, которые я хочу. Вы не возражаете объяснить? Спасибо! – Grigor

+3

Это очень похоже на: http://stackoverflow.com/questions/3538858/mysql-how-to-fill-missing-dates-in-range – noz

ответ

1

Вы можете использовать запрос, как это:

select 
    date_format(t.d + INTERVAL t.h HOUR, '%Y-%m-%d %h%p') as date, 
    count(id) as 'Number of registrations' 
from (
    SELECT * 
    FROM 
    (SELECT DISTINCT DATE(create_time) d FROM users) dates, 
    (SELECT 0 h UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
    UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 
    UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 
    UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
    UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
    UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23) hours 
) t LEFT JOIN users 
    ON DATE(users.create_time)=t.d AND HOUR(users.create_time)=t.h 
group by t.d, t.h 
order by t.d, t.h 

Пожалуйста, смотрите скрипку here.

+0

Это Слишком медленно для db с 1000 результатами. Хороший метод тем не менее. – Grigor

1

Вам необходимо сгенерировать все возможные комбинации дня и часа.

Если предположить, что у вас есть по крайней мере одна запись на каждый день и по одной записи для каждого часа, вы можете сделать:

select concat(d.theday, ' ', h.thehour) as date, 
     count(id) as 'Number of registrations' 
from (select distinct date_format(create_time, '%Y-%m-%d') as theday from users 
    ) d cross join 
    (select distinct date_format(create_time, '%h%p') as thehour from users 
    ) h left outer join 
    users u 
    on date_format(u.create_time, '%Y-%m-%d %h%p) = concat(d.theday, ' ', h.thehour) 
group by concat(d.theday, ' ', h.thehour) 
order by 1 desc; 
+0

Работает, если результатов в дБ нет. Слишком медленно. Спасибо хоть! – Grigor

Смежные вопросы