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 を示すレコードを持つ 2 番目のテーブルもあります。

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

次のように、各月の値を格納する別のテーブル (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 に答える
0

年/月テーブルを作成し、メンバー テーブルへの左結合を使用できます。

于 2012-11-14T17:14:02.967 に答える