I have this query:
SELECT COUNT(*) as clicks, DATE_FORMAT(FROM_UNIXTIME(click_date), '%w %M %Y') as point
FROM tracking
WHERE click_date < $end_date AND click_date > $start_date
GROUP BY DAY(FROM_UNIXTIME(click_date))
Where $start_date is two weeks ago and $end_date is today’s date.
I am trying find all clicks made each day for a particular date range. I also want to include days where there has been no clicks. Since naturally there isn’t an entry for these in my database I need to include them some how, how can I best do this whilst showing all dates from start date to end date. This what I currently have, lots of gaps for this two week date range.
Array
(
[0] => Array
(
[clicks] => 17
[point] => 0 February 2011
)
[1] => Array
(
[clicks] => 3
[point] => 1 February 2011
)
[2] => Array
(
[clicks] => 14
[point] => 5 February 2011
)
[3] => Array
(
[clicks] => 1
[point] => 1 February 2011
)
[4] => Array
(
[clicks] => 8
[point] => 2 February 2011
)
)
Can this possibly be done via a pure SQL query or do I have to use some php logic?
Btw, why do I have 0 February 2011 as my first date! Hmm, I also seem to have duplicate dates, that shouldn’t happen, maybe my GROUP BY isn’t working correctly?
Thanks all for any help.
Yes, it is better to create a Numbers table (single column N) that contains nothing but the numbers 0 to 999. It can be used for many things, not least a query like the below:
You’re using the wrong format. It’s UPPER case W not lower for day-of-week, so ‘%W %M %Y’ or ‘%d %M %Y’ for day-of-month.
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
You are using
GROUP BY DAY(FROM_UNIXTIME(click_date))note “day” not weekday, but you are displaying (or trying to) “%W” (weekday) – pick one, don’t mix them.EDIT: If you prefer not to materialize (create as a real table) a Numbers sequence table, you can construct one on the fly. It won’t be pretty.
Note: N1, N2 and N3 below combine to give a possible range of 0-999
EDIT #2: A straight Dates table
Put this in a new window in phpMyAdmin or run it as a batch. It creates a table named Dates, with every single date from day
1900-01-01(or change in the script) to2300-01-01(or change).With such a utility table, your query can be just