■日本 10件 ←ここをチェックすると
□米国 5件
□中国 5件
□承認済み 7件 ←件数が変わる
□未承認 3件 ←件数が変わる
上記、もし未チェック分を表示する処理ならチェックしたもの以外を検索するので
SQL
1select カテゴリ,count(*) from tbl where not 国 in('日本')
のような処理になります
sample
※今回は面倒なのでjQueryで
javascript
1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
2<script>
3$(function(){
4 $('[name="country[]"]').on('change',function(){
5 $.ajax({
6 url:"recv.php",
7 data:$('[name="country[]"]:checked').map(function(){
8 return "country[]="+encodeURIComponent($(this).val());
9 }).get().join("&"),
10 }).done(function(data){
11 console.log(data);
12 /* 実際にはここで承認済み、非承認の件数を書き換える */
13 });
14 });
15});
16</script>
17
18<div><label><input type="checkbox" name="country[]" value="日本">日本</label>:10件</div>
19<div><label><input type="checkbox" name="country[]" value="米国">米国</label>:4件</div>
20<div><label><input type="checkbox" name="country[]" value="中国">中国</label>:4件</div>
21
22<ul>
23<li>承認済み:<span id="shouninzumi">0</span>件
24<li>未承認:<span id="mishounin">0</span>件
25</ul>
PHP
1<?PHP
2$country=filter_input(INPUT_GET,"country", FILTER_DEFAULT , FILTER_REQUIRE_ARRAY);
3$sql ="select カテゴリ,count(*) as 件数from tbl where 1 ";
4$data=[];
5if(count((array) $country)>0){
6 $sql.="and 国 in (".implode(",",array_fill(0,count($country),"?")).")";
7 $data=$country;
8}
9$sql.=" group by カテゴリ";
10print $sql.";\n";
11print_r($data);
12/* 実際には$sqlをprepareで処理してカテゴリごとの件数をjsonで返すのがベター */
DB設計について
集計のロジックを変えます
テーブルはこんな感じになります
SQL
1create table tbl(id int primary key,国 varchar(10),承認 varchar(10),その他 varchar(10));
2insert into tbl values
3( 1,'日本','承認済み','その他1'),
4( 2,'日本','承認済み','その他1'),
5( 3,'日本','承認済み','その他2'),
6( 4,'日本','承認済み','その他2'),
7( 5,'日本','承認済み','その他2'),
8( 6,'日本','承認済み','その他2'),
9( 7,'日本','承認済み','その他3'),
10( 8,'日本','未承認','その他1'),
11( 9,'日本','未承認','その他2'),
12(10,'日本','未承認','その他2'),
13(11,'米国','承認済み','その他1'),
14(12,'米国','承認済み','その他1'),
15(13,'米国','承認済み','その他1'),
16(14,'米国','未承認','その他3'),
17(15,'中国','承認済み','その他1'),
18(16,'中国','承認済み','その他2'),
19(17,'中国','承認済み','その他3'),
20(18,'中国','承認済み','その他2');
SQL
1select '国' as カテゴリ,国 as 要素,sum(1) as 件数 from tbl group by 国
2union all select '承認' as カテゴリ,承認 as 要素,sum(1) as 件数 from tbl group by 承認
3union all select 'その他' as カテゴリ,その他 as 要素,sum(1) as 件数 from tbl group by その他
国の集計以外の件数集計にor条件を追加します
SQL
1select '国' as カテゴリ,国 as 要素,sum(1) as 件数 from tbl group by 国
2union all select '承認' as カテゴリ,承認 as 要素,sum(1 and (0 or 国 in('日本'))) as 件数 from tbl group by 承認
3union all select 'その他' as カテゴリ,その他 as 要素,sum(1 and (0 or 国 in('日本'))) as 件数 from tbl group by その他
4
SQL
1select '国' as カテゴリ,国 as 要素,sum(1 and (0 or 承認 in('未承認'))) as 件数 from tbl group by 国
2union all select '承認' as カテゴリ,承認 as 要素,sum(1 and (0 or 国 in('日本'))) as 件数 from tbl group by 承認
3union all select 'その他' as カテゴリ,その他 as 要素,sum(1 and (0 or 国 in('日本') or 承認 in('未承認'))) as 件数 from tbl group by その他
これを更に集計するとこう
SQL
1select カテゴリ,group_concat(concat(要素,":",件数)) as 要素件数 from(
2select '国' as カテゴリ,国 as 要素,sum(1 and (0 or 承認 in('未承認'))) as 件数 from tbl group by 国
3union all select '承認' as カテゴリ,承認 as 要素,sum(1 and (0 or 国 in('日本'))) as 件数 from tbl group by 承認
4union all select 'その他' as カテゴリ,その他 as 要素,sum(1 and (0 or 国 in('日本') or 承認 in('未承認'))) as 件数 from tbl group by その他
5) as sub
6group by カテゴリ
カテゴリ | 要素件数 |
---|
その他 | その他2:6,その他3:2,その他1:3 |
国 | 中国:0,日本:3,米国:1 |
承認 | 承認済み:7,未承認:3 |
これを受けてjsonを返してやればよいでしょう
※注意
where句で絞り込みをすると0件のデータが表示されなくなります。
0と表示したいなら今回のようなsumで集計、
表示しなくてもいいなら(つまりjs側で例外処理が必要)where句で絞り込みをしてください
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/06 02:33
2018/12/06 03:05
2018/12/06 03:15
2018/12/06 03:41
2018/12/06 04:45
2018/12/06 04:51
2018/12/06 05:48
2018/12/06 06:47
2018/12/06 06:52
2018/12/06 07:00 編集
2018/12/06 07:09
2018/12/06 08:05