问题
I have a query that looks like this:
SELECT count(*)
,date_format(created, '%d/%m/%y ') as datecreated
FROM mimesi_indexer.meta_served_clips
GROUP BY DATE(created)
ORDER BY created ASC
The problem is that some dates are missing in the database. I need to have those dates into the results showing the date's count as 0 and the date itself. How can I do it please? Thanks
EDIT:
count(*) is in the left column
created is the right one
a) data:
2610, 11/04/17
1332, 12/04/17
2082, 26/04/17
3584, 27/04/17
b) expected result:
2610 11/04/17
1332 12/04/17
0 13/04/17
0 14/04/17
0 15/04/17
0 16/04/17
0 17/04/17
0 18/04/17
0 19/04/17
0 20/04/17
0 21/04/17
0 22/04/17
0 23/04/17
0 24/04/17
0 25/04/17
2082 26/04/17
3584 27/04/17
c) actual result:
2610 11/04/17
1332 12/04/17
2082 26/04/17
3584 27/04/17
回答1:
it might not be a perfect solution, but this might give you the result:
the second query after UNION ALL
in the inner SELECT should return all dates between the MIN(created)
and the MAX(created)
of your table with the counter value 0.
SELECT SUM(a.ctr)
,a.datecreated
FROM
(
SELECT COUNT(*) as ctr, date_format(created, '%d/%m/%y ') as datecreated
FROM mimesi_indexer.meta_served_clips
GROUP BY DATE(created)
UNION ALL
select 0 as ctr, date_format(selected_date, '%d/%m/%y ') as datecreated
from
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_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) v
where selected_date
between (SELECT MIN(created) FROM mimesi_indexer.meta_served_clips)
and (SELECT MAX(created) FROM mimesi_indexer.meta_served_clips)
) a
group by a.datecreated
order by month(a.datecreated), date(a.datecreated)
来源:https://stackoverflow.com/questions/45011431/find-missing-date-and-add-them-into-result-mysql