根据以下评论修改24/11/2012。
我有一个成员的MySQL数据库(v5.0.95)列出他们加入的时间
CREATE TABLE IF NOT EXISTS `members` (
`id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
`name` varchar(64) NOT NULL,
`joined` datetime NOT NULL,
KEY `id` (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我还有第二张表,其中有记录表明哪个YYYY-MM
CREATE TABLE IF NOT EXISTS `blocker` (
`group_id` int(11) NOT NULL,
`YYYYMM` char(7) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
理想情况下,以下联接将提供以下
SELECT date_format( m.joined, '%Y-%m' ) AS DateJoined, count( * ) AS NumJoined
FROM members AS m
LEFT OUTER JOIN blocker AS b
ON b.YYYYMM = date_format( m.joined, '%Y-%m')
WHERE m.group_id =1637017 AND b.group_id =1637017
GROUP BY DateJoined
ORDER BY DateJoined ASC
会给我这个
DateJoined NumJoined
2012-01 0
2012-02 0
2012-03 0
2012-04 17
2012-05 0
2012-06 12
2012-07 10
2012-08 10
2012-09 11
2012-10 14
2012-11 4
不幸的是,它没有提供零结果月份给我这个
DateJoined NumJoined
2012-04 17
2012-06 12
2012-07 10
2012-08 10
2012-09 11
2012-10 14
2012-11 4
任何指针都将不胜感激。我接近了吗??
答案 0 :(得分:3)
sql数据库无法为您生成不存在的数据。如果没有人在特定的月份加入,那么你就无法从神奇地创造那个月。
如果你想强迫它,你必须有一个临时表,列出你想要的范围内的个别月份,然后你可以加入该临时表并获得你的0计数。
答案 1 :(得分:0)
您可以创建年/月表并使用左连接到成员表。
答案 2 :(得分:0)
创建另一个表(可以命名为dateCalender),存储每个月的值,如下所示:
2012-01
2012-02
2012-03
2012-04
2012-05
2012-06
2012-07
2012-08
2012-09
2012-10
2012-11
现在使用此新表与原始表的左外连接来检索结果,有效月份的月份将返回值,对于没有任何值的月份,它将返回Null(可以表示为0)< / p>