2016-11-27 2 views
4

я таблице ниже:MySQL выберите даты изо дня в день

     login 
      date      user  
     2016-11-23     1 
     2016-11-23     2 
     2016-11-23     3 
     2016-11-25     2 
     2016-11-25     5 
     2016-11-27     1 

из приведенной выше таблицы, что я хочу, чтобы получить, как это:

 date     count(*) 
    2016-11-21     0 
    2016-11-22     0  
    2016-11-23     3 
    2016-11-24     0 
    2016-11-25     2 
    2016-11-26     0 
    2016-11-27     1 

Но, поскольку есть даты только 2016-11-23 и 2016-11-25 и 2016-11-27, когда я запрос, как это:

select date, count(*) 
from login 
where date between (current_date()-interval 7 day) and current_date() 
group by date 
order by date asc 

это Ĉ не получай результата, как то, что я действительно хочу получить. Возможно ли это из моей таблицы login?

ответ

3

Один из способов заключается в создании всех дней до РЕГИСТРИРУЙТЕСЬ

select GenDate, count(Date) 
from login 
right join 
(select a.GenDate 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as GenDate 
    from (select 0 as a 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) as a 
    cross join (select 0 as a 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) as b 
    cross join (select 0 as a 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) as c 
) a 
where a.GenDate between (current_date()-interval 7 day) and current_date())x 
ON x.GenDate=login.Date 
group by GenDate 
order by GenDate asc 
+1

Фактически 'COUNT (*)' здесь не подходит, он вернется 1 в течение дней без совпадений. – sagi

+0

@sagi Исправлено, вы правы – Mihai

1

Используйте полученную таблицу с желавших датами:

SELECT t.date, count(s.date) 
FROM (SELECT '2016-11-21' as `date` UNION ALL 
     SELECT '2016-11-22' as `date` UNION ALL 
     ...) t 
LEFT JOIN login s 
ON(t.date = s.date) 
WHERE 
    t.date between (current_date()-interval 7 day) and current_date() 
GROUP BY t.date 
ORDER BY t.date 
1

Это очень хорошо известная проблема в программировании. Существует несколько решений.

  1. Перейдите к результату с помощью PHP и заполните отсутствующие дни в результирующем массиве.

  2. AS sagi предложил создать отдельную таблицу, содержащую все даты в диапазоне дней работы вашего приложения, а затем вы можете присоединиться к этой таблице с вашим запросом. Одна из проблем заключается в том, что время от времени вам приходится добавлять больше дней в эту таблицу, если у вас внезапно отсутствуют дни в будущем или в прошлом.

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