2017-04-25 3 views
1

私はログテーブルを持っていますので、詳細をチャートに表示したいので、1月から月現在、その月の活動がゼロであれば、チャートが流れることができるように、それはゼロを返す必要があり、mysqlのカウントからゼロを返しても、その月の結果はありません

表は次のようになりますことがあります。私はこのページのトップへ参照を望んでいた

id  user_id action     date_added 
75  56  Base Adding   2017-02-29 11:52:35 
76  56  Base Adding   2017-02-29 11:59:28 
77  61  Fuel Adding   2017-02-29 12:05:16 
78  56  Update details   2017-02-29 12:17:08 
79  57  Logged In    2017-02-29 12:25:41 
80  56  Base Adding   2017-03-29 12:40:56 
81  55  Logged In    2017-02-29 12:51:31 
82  56  Base Adding   2017-05-29 12:53:25 

結果のようなものですこれは:

MonthAdded   Totalcount 
2017-01    0 
2017-02    2 
2017-03    1 
2017-04    0 
2017-05    1 

私のクエリはこのように見え、出力が得られないので、助けてください。

SELECT DATE_FORMAT(date_added, '%Y-%m') AS MonthAdded, COUNT(id) AS Totalcost FROM audit_log WHERE date_added LIKE '%2017%' AND user_id = '56' AND (action = 'Base Adding') GROUP BY DATE_FORMAT(date_added, '%Y-%m') ASC 
+0

、これは不可能です..あなたはこの2017から02以上の2つのカウントを有します。 –

+0

Base Addのアクションは2つです2017-02 – Rhynix

+0

明確な質問をしてください... –

答えて

0

はここにあなたのサンプルデータによると、詳細です:

詳細な結果:

select MonthAdded,count(date_substr) as cnt from   
(select '2017-01'as MonthAdded UNION all 
select '2017-02' UNION all 
select '2017-03' UNION all 
select '2017-04' UNION all 
select '2017-05' UNION all 
select '2017-06' UNION all 
select '2017-07' UNION all 
select '2017-08' UNION all 
select '2017-09' UNION all 
select '2017-10' UNION all 
select '2017-11' UNION all 
select '2017-12') as a 

left join 

(select id, user_id, action, date_added,SUBSTRING(date_added FROM 1 FOR 7) as date_substr from 
(select 75 as id,  56 as user_id,  'Base Adding' action,   '2017-02-29 11:52:35' as date_added UNION all 
select 76,  56,  'Base Adding',   '2017-02-29 11:59:28' UNION all 
select 77,  61,  'Fuel Adding',   '2017-02-29 12:05:16' UNION all 
select 78,  56,  'Update details' ,  '2017-02-29 12:17:08' UNION all 
select 79,  57,  'Logged In' ,   '2017-02-29 12:25:41' UNION all 
select 80,  56,  'Base Adding',   '2017-03-29 12:40:56' UNION all 
select 81,  55,  'Logged In' ,   '2017-02-29 12:51:31' UNION all 
select 82,  56,  'Base Adding',   '2017-05-29 12:53:25') as a 
where action = 'Base Adding' and user_id = 56) as b 

on a.MonthAdded = b.date_substr 
group by MonthAdded 

最終的なクエリ構造:

select MonthAdded,count(date_substr) as cnt from   
(select '2017-01'as MonthAdded UNION all 
select '2017-02' UNION all 
select '2017-03' UNION all 
select '2017-04' UNION all 
select '2017-05' UNION all 
select '2017-06' UNION all 
select '2017-07' UNION all 
select '2017-08' UNION all 
select '2017-09' UNION all 
select '2017-10' UNION all 
select '2017-11' UNION all 
select '2017-12') as a 

left join 

(select id, user_id, action, date_added,SUBSTRING(date_added FROM 1 FOR 7) as date_substr from 
(select * from yourtable) as a 
where action = 'Base Adding' and user_id = 56) as b 

on a.MonthAdded = b.date_substr 
group by MonthAdded 

あなたならば12月に確認することまでは含まその上にデータがあります。

結果:

2017-01 0 
2017-02 2 
2017-03 1 
2017-04 0 
2017-05 1 
2017-06 0 
2017-07 0 
2017-08 0 
2017-09 0 
2017-10 0 
2017-11 0 
2017-12 0 
+0

@redsに感謝しています。魔法のように機能しました...もう1つだけ何がこの行のクエリを実行しますか?SUBSTRING(date_added FROM 1 FOR 7) – Rhynix

+0

これは、 "2017-12"のように1から7までの任意の値から文字を取得する機能です。長さは7文字です –

+0

DATE_FORMAT(date_added、 '%Y-%m ')? – Rhynix

関連する問題