0

根据以下评论于 2012 年 11 月 24 日修订。

我有一个成员的 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

任何指针将不胜感激。我接近了吗……?

4

3 回答 3

3

sql 数据库无法为您生成不存在的数据。如果在某个特定月份没有人加入,你就不能让它神奇地从无到有产生那个月。

如果你想强制它,你必须有一个临时表,其中列出了你想要的范围内的各个月份,然后你可以加入该临时表并获得你的 0 计数。

于 2012-11-14T17:12:08.183 回答
0

您可以创建年/月表并使用左联接到成员表。

于 2012-11-14T17:14:02.967 回答
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)

于 2012-11-15T07:19:29.323 回答