MySQL show count of 0 for dates with no records

前端 未结 2 1939
被撕碎了的回忆
被撕碎了的回忆 2021-01-15 16:02

I\'m trying to get the COUNT of all users attempts by a list of the current week (last 7 days)

This query works but doesnt return 0 if the day not exist:

         


        
相关标签:
2条回答
  • 2021-01-15 16:04

    Create a calendar table or you could try:

    SELECT COUNT(*) AS attempt_count,
           DATE_FORMAT(ca_date,'%Y/%m/%d') AS attempt_date
    FROM
      (SELECT STR_TO_DATE('2014/06/19', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/18', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/17', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/16', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/15', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/14', '%Y/%m/%d') ca_date
       UNION ALL SELECT STR_TO_DATE('2014/06/13', '%Y/%m/%d') ca_date) AS calendar
    LEFT JOIN users_attempts ON users_attempts.attempt_date = calendar.ca_date
    GROUP BY calendar.ca_date
    ORDER BY calendar.ca_date DESC;
    
    0 讨论(0)
  • 2021-01-15 16:21

    Ok from my previous answer from the thread MySql Single Table, Select last 7 days and include empty rows

    Here what you can do for making the date selection dynamic

    select 
    t1.attempt_date,
    coalesce(SUM(t1.attempt_count+t2.attempt_count), 0) AS attempt_count
    from
    (
      select DATE_FORMAT(a.Date,'%Y/%m/%d') as attempt_date,
      '0' as  attempt_count
      from (
        select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
        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.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW()
    )t1
    left join
    (
      SELECT DATE_FORMAT(attempt_date,'%Y/%m/%d') AS attempt_date, 
      COUNT(*) AS attempt_count
      FROM users_attempts
      WHERE DATE_SUB(attempt_date, INTERVAL 1 DAY) > DATE_SUB(DATE(NOW()), INTERVAL 1 WEEK) 
      GROUP BY DAY(attempt_date) DESC
    )t2
    on t2.attempt_date = t1.attempt_date
    group by DAY(t1.attempt_date)
    order by t1.attempt_date desc;
    

    DEMO

    0 讨论(0)
提交回复
热议问题