1

私は2つのMySQLテーブル(ユーザーとコメント)を持っています-私がやりたいのは、1つのコメントをしたユーザーの数、2つのコメントをしたユーザーの数、3つのコメントをしたユーザーの数、4+を作ったユーザーの数を示すレポートをフェッチすることです月と年でグループ化されたコメント。

年/月ごとにグループ化された各ユーザーによるコメントの数を取得するために、このクエリがあります

select year(c.datecreated) as comment_year, month(c.datecreated) as comment_month,      
count(c.id) as num_comments
from tblcomments c
inner join tbluser u on u.id = c.userid
where 
c.datecreated <= '2013-02-19' and c.datecreated >= '2012-03-01'
group by c.userid, year(c.datecreated), month(c.datecreated)

このクエリを変更して、希望する結果を得るにはどうすればよいですか?

4

2 に答える 2

2

サブクエリを使用して、結果をもう一度グループ化します。

SELECT   ym, 
         SUM(c = 1) AS `num_1`,
         SUM(c = 2) AS `num_2`,
         SUM(c = 3) AS `num_3`,
         SUM(c>= 4) AS `num_4+`
FROM (
  SELECT   DATE_FORMAT(datecreated, '%Y-%m') AS ym, COUNT(*) AS c
  FROM     tblcomments
  WHERE    datecreated BETWEEN '2012-03-01' AND '2013-02-19'
  GROUP BY ym, userid
) t
GROUP BY ym
于 2013-02-19T16:32:41.267 に答える
0

これを行う1つの方法があります-tbluserに参加する必要があるかどうかはわかりませんが、そのままにしておきました。

SELECT comment_year, comment_month,
  COUNT(userId) userCnt,
  Num_Comments 
FROM (
  select 
    year(c.datecreated) as comment_year, 
    month(c.datecreated) as comment_month,      
    c.userid,
    CASE WHEN count(c.id) >= 4 THEN '4+' ELSE CAST(COUNT(c.id) as varchar) END as num_comments
  from tblcomments c
    inner join tbluser u on u.id = c.userid
  where 
    c.datecreated <= '2013-02-19' and c.datecreated >= '2012-03-01'
  group by c.userid, year(c.datecreated), month(c.datecreated)
  ) t
GROUP BY comment_year, comment_month, Num_Comments;

そして、いくつかのサンプルフィドル:http ://sqlfiddle.com/#!3 / 5fb5c / 5

于 2013-02-19T16:34:14.810 に答える