问题描述
下面是我的MysqL表:
MysqL> DESCRIBE mytable;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| url_timestamp | timestamp | NO | | NULL | |
| cr_num | varchar(50) | NO | | NULL | |
| status | varchar(255) | NO | | NULL | |
| rollback_date | timestamp | YES | | NULL | |
| rollback_user | varchar(255) | YES | | NULL | |
+---------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
我希望获得cr_num的按月计数,这是过去12个月的主键。
MysqL> SELECT MONTHNAME(url_timestamp),COUNT(url_timestamp) FROM mytable WHERE status='PRODUCTION' and url_timestamp >= Now() - INTERVAL 1 YEAR GROUP BY MONTHNAME(url_timestamp);
+--------------------------+----------------------+
| MONTHNAME(url_timestamp) | COUNT(url_timestamp) |
+--------------------------+----------------------+
| November | 43 |
| December | 69 |
| January | 220 |
| October | 225 |
| February | 209 |
| march | 123 |
| April | 93 |
| May | 113 |
| June | 217 |
| July | 129 |
| August | 185 |
| September | 415 |
+--------------------------+----------------------+
12 rows in set (0.01 sec)
我得到的输出有三个问题。
我不是来自数据库背景,所以我没有对我本来可以尝试的东西进行过多的研究。
解决方法
您的条件(2)和(3)不兼容。要从今年开始只获得几个月的时间:
SELECT MONTHNAME(url_timestamp),COUNT(*)
FROM mytable
WHERE status = 'PRODUCTION' AND
YEAR(url_timestamp) = YEAR(NOW())
GROUP BY MONTHNAME(url_timestamp)
ORDER BY MIN(url_timestamp)
,
您可以使用功能LAST_DAY()
来按月分组,并使用DATE_FORMAT()
来用年份格式化月份:
SELECT DATE_FORMAT(LAST_DAY(url_timestamp),'%M %Y') month,COUNT(url_timestamp) counter
FROM mytable
WHERE status='PRODUCTION' and url_timestamp >= NOW() - INTERVAL 1 YEAR
GROUP BY month;
要正确地对行进行排序,还需要GROUP BY LAST_DAY(url_timestamp)
,以便可以在ORDER BY
子句中使用它:
SELECT DATE_FORMAT(LAST_DAY(url_timestamp),COUNT(url_timestamp) counter
FROM mytable
WHERE status='PRODUCTION' and url_timestamp >= NOW() - INTERVAL 1 YEAR
GROUP BY month,LAST_DAY(url_timestamp)
ORDER BY LAST_DAY(url_timestamp);