3

There is a table which has data as such:

-----------------------
|   id   |    date    |
-----------------------
|   1    | 2016-07-11 |
|   2    | 2016-07-11 |
|   3    | 2016-07-15 |
|   4    | 2016-07-15 |
|   5    | 2016-07-15 |
|   6    | 2016-07-16 |
|   7    | 2016-07-19 |
|   8    | 2016-07-20 |
-----------------------

I want to get a date range (all dates) and the count of IDs for each date, returning 0 when no records exist.

If run for dates between 2016-07-10 to 2016-07-20, the result should look like this:

--------------------------
|    date    | count(id) |
--------------------------
| 2016-07-10 |     0     |
| 2016-07-11 |     2     |
| 2016-07-12 |     0     |
| 2016-07-13 |     0     |
| 2016-07-14 |     0     |
| 2016-07-15 |     3     |
| 2016-07-16 |     1     |
| 2016-07-17 |     0     |
| 2016-07-18 |     0     |
| 2016-07-19 |     1     |
| 2016-07-20 |     1     |
--------------------------

I've found solutions for getting a date range but couldn't figure out how to get it to count the IDs that exist for those dates within a table.

Thanks!

Community
  • 1
  • 1
Muhammad Ali
  • 668
  • 1
  • 9
  • 24
  • you can use Aggregate function "Count", with your select query to count no of records for a particular date. – Milan Gupta Jul 20 '16 at 05:05
  • Create permanent daily or monthly [Helper Tables](http://stackoverflow.com/a/37739514) once and use them often. Makes for much faster joins that hacking them together on the fly each time. – Drew Jul 20 '16 at 05:30
  • Drew, are you sure? – Strawberry Jul 20 '16 at 05:45

2 Answers2

6

I figured this out by modifying the query given in the solution for getting all dates.

The following query returns all dates, and counts of the IDs if any records exist:

select d.date, count(v.id) from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) d
left join visitors v on d.date = v.date
where d.date between '2016-06-01' and '2016-06-30'
group by d.date
order by d.date

Courtesy for getting the dates range goes to @mark-bannister and a simple join on the query matching for results, and sorting gets the solution.

Community
  • 1
  • 1
Muhammad Ali
  • 668
  • 1
  • 9
  • 24
0

Please try the following, basically a group by is needed that would help you get the desired result. Also have the where condition with range as needed

SELECT date ,count(date) from datetable group by date;