2013-12-17 3 views
1

У меня есть ниже запрос работает на MySQLВозврат отсчеты 0 из MySQL «COUNT()»

SELECT DATE(field) AS day, COUNT(*) AS totalSessions 
FROM table 
GROUP BY DATE(field) 
ORDER BY field DESC 
LIMIT 7 

возвращает

day  | totalSessions 
2013-12-17 | 5 
2013-12-15 | 1 

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

day  | totalSessions 
2013-12-17 | 5 
2013-12-16 | 0 
2013-12-15 | 1 
2013-12-14 | 0 
2013-12-13 | 0 
2013-12-12 | 0 
2013-12-11 | 0 
+0

Есть ли записи в вашем столе для 2013-12-16, 2013-12-14 и т. Д.? – Robbert

+0

@ Robbert нет, нет. Я надеюсь на способ превратить сессии «NULL» в 0 сеансов. – mhopkins321

+1

Осталось Вставить таблицу в себя. – Mihai

ответ

2

Возможно, вам нужно будет указать (где-нибудь) даты, которые вы хотите вернуть. Я думаю, что хранимая процедура может помочь вам:

delimiter $$ 
create procedure getStuff(d0 date, d1 date) 
begin 
    declare d date; 
    drop table if exists temp_dates; 
    create temporary table temp_dates (
     d date not null primary key 
    ); 
    set d = d0; 
    while d <= d1 do 
     insert into temp_dates values (d); 
     set d = date_add(d, interval +1 day); 
    end while; 
    select 
     a.d as day, 
     count(b.field) as totalSessions 
    from 
     temp_dates as a 
     left join yourTable as b on a.d = b.dateField -- Assuming "dateField" holds the date 
    group by 
     a.d; 
end $$ 
delimiter ; 

Надеется, что это помогает

+1

Помните: временные таблицы видны только для соединения, которое их создает. – Barranka

1

Не самый красивое решение, но стоит выстрел:

SELECT 
    FAKE.dt, 
    COUNT(YT.id) AS totalSessions 
FROM (
    SELECT DATE(NOW()) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 2 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 4 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 5 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 6 DAY)) as dt 
) FAKE 
LEFT JOIN yourtable YT ON YT.datefield = FAKE.dt 
GROUP BY FAKE.dt 
ORDER BY FAKE.dt DESC 

Так вы выбрали 7 дат назад, начиная сегодня, союз результаты, левые соединяют нужные вам данные, группируют и упорядочивают по дате.

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