SELECT `Date`, SUM(Clicks) AS Clicks, DAY(LAST_DAY(NOW())) AS Monthdays FROM myTbl WHERE ( DATE BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW() ) AND MoverID = 123 GROUP BY `Date` ASC
Я не хочу использовать ПРОЦЕДУЮ следующим образом: http://stackoverflow.com/questions/7252460/mysql-group-by-and-fill-empty-rows
Я не хочу создавать целый день, содержащий таблицу следующим образом: http://stackoverflow.com/questions/5988179/mysql-group-by-date-how-to-return-results-when-no-rows
Я могу использовать SELECT @@global.time_zone, @@session.time_zone;
в PHP и после того, как результат запроса MySQL отсутствует, я делаю PHP в том же часовом поясе, что и MySQL, и заполняю дату PHP. Но как я могу это сделать в MySQL?
Вы можете использовать трюк для создания виртуальной таблицы со всеми датами, которые вам нужны, с другой таблицей (замените aux
любой таблицей в вашей БД с 31 рецензией, по крайней мере):
SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d` FROM `aux`, (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x` WHERE @d < DATE_SUB(NOW(), INTERVAL 1 DAY) LIMIT 31
И затем присоединитесь к нему на столе:
SELECT `aux`.`d` as `Date`, SUM(IFNULL(`Clicks`, 0))AS `Clicks`, DAY(LAST_DAY(NOW())) AS `Monthdays` FROM ( SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d` FROM `aux`, (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x` WHERE @d < DATE_SUB(NOW(), INTERVAL 1 DAY) LIMIT 31 ) aux LEFT JOIN myTbl ON `Date` = `aux`.`d` GROUP BY `aux`.`d`