- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
Дано:
CREATE TABLE IF NOT EXISTS `statistic` (
`type` tinyint(4) NOT NULL DEFAULT '0',
`date` date NOT NULL DEFAULT '0000-00-00',
`user` int(11) NOT NULL DEFAULT '0',
`count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`user`,`date`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
INSERT INTO `statistic` (`type`, `date`, `user`, `count`) VALUES
(1, '2013-10-14', 1, 6),
(2, '2013-10-14', 1, 6),
(2, '2013-10-16', 1, 11),
(2, '2013-10-15', 1, 1),
(2, '2013-10-16', 26, 4),
(2, '2013-10-16', 25, 1),
(2, '2013-10-16', 29, 3),
(2, '2013-10-16', 27, 1),
(2, '2013-10-17', 22, 1),
(2, '2013-10-21', 1, 2),
(1, '2013-10-21', 1, 1),
(1, '2013-10-22', 1, 1),
(2, '2013-10-22', 1, 1);
Задача: выбрать статистики (2 типа) за 30 дней, для текущего пользователя, в разрезе по дням.
Решение:
SELECT t.dates,
SUM(IF(type=1,count,0)) AS type1,
SUM(IF(type=2,count,0)) AS type2
FROM (
SELECT SUBDATE(DATE(NOW()),INTERVAL `index` DAY) AS dates
FROM
(
SELECT 0 AS `index` 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 UNION
SELECT 10 UNION
SELECT 11 UNION
SELECT 12 UNION
SELECT 13 UNION
SELECT 14 UNION
SELECT 15 UNION
SELECT 16 UNION
SELECT 17 UNION
SELECT 18 UNION
SELECT 19 UNION
SELECT 20 UNION
SELECT 21 UNION
SELECT 22 UNION
SELECT 23 UNION
SELECT 24 UNION
SELECT 25 UNION
SELECT 26 UNION
SELECT 27 UNION
SELECT 28 UNION
SELECT 29
) AS t
) AS t
LEFT JOIN statistic ON t.dates=date AND user=1
GROUP BY dates
ORDER BY dates