人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MYSQLとPHPでサイトを制作していて、レコード数のカウントでいろいろと悩んでいます。

現在は下記のSQL文で、フィールドAのレコードを各種別によってカウントしています。

例)
全レコード数 10件
フィールドデータが1の物 1件
フィールドデータが2の物 4件
フィールドデータが3の物 5件

SQL文
select フィールドA, count(*) as cnt from テーブル group by フィールドA

上記のカウントとは別でフィールドBのデータも各種別によってカウントしたいのですが何か良い方法はないでしょうか?
現在は上記のSQL文を2種類作ってカウントしています。
他にもカウントしたいものがあるので、このままだと何回も記述することになるので一気にカウントしたいです。

どなたか解る人お願いします。

●質問者: black_kenchan
●カテゴリ:インターネット ウェブ制作
✍キーワード:as CNT GROUP MySQL PHP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● llusall
●5ポイント

あらかじめ、各種別が決まっているのであれば

次のようなSQLで一発で取得してみてはどうでしょうか?


SELECT count(*) as cnt_total,

sum(if(フィールドA=1,1,0)) as cnt_a1,

sum(if(フィールドA=2,1,0)) as cnt_a2,

sum(if(フィールドA=3,1,0)) as cnt_a3,

sum(if(フィールドB=1,1,0)) as cnt_b1,

sum(if(フィールドB=2,1,0)) as cnt_b2,

sum(if(フィールドB=3,1,0)) as cnt_b3

FROM テーブル

◎質問者からの返答

決まっていない場合は、どうすればよいでしょうか?


2 ● falcosapiens
●5ポイント

単純に行数を減らしたいのであれば,

phpの段階で必要なフィールド名を配列に格納し

異なるSQL文を順次発行してくことになるかと。

$field = array('フィールドA', 'フィールドB', 'フィールドC');

foreach ($field as &$value) {

$sql = "select".$value.", count(*) as cnt from テーブル group by ".$value;

$result = mysql_query ($sql)

or die ("Invalid query");

}

なお,動作確認していないのでご注意。

http://php.s3.to/man/control-structures.foreach.html


3 ● くいっぱ
●70ポイント ベストアンサー

こんにちは、様子をうかがってたのですが…

やりたいことが把握しきれないので、確認しつつ手探りで…。


フィールドBについてもというのは…

select フィールドA,フィールドB count(*) as cnt from テーブル group by フィールドA,フィールドB

このような事ではないですよね??

このように記述すればA、Bのカウントが取れます。

ただ、Aのフィールドが1のものが10件あったとして、Bのフィールドが1のものが3件、2のものが7件合った場合、

AとBについてgroup byされますので、Aが1のものが10件とはでてくれません。

特定のA特定のBについて集計したいのであれば、ご高察のとおりSQLを複数回発行したほうが楽チンではあります。

へたなSQLを組むよりはそちらの方がよいかと思います。


もしSQLの発行回数を抑えたいというのが目的なのであれば、

mySQL5以上になりますが、

select 
* from
(select フィールドA, count(*) as cnt1 from テーブル group by フィールドA) tbl1,
(select フィールドB, count(*) as cnt2 from テーブル group by フィールドB) tbl2

というようなサブクエリにしてしまうやり方もありますよ。


select 
tbl1.フィールドA, 
count(tbl1.フィールドA) cnt1,
tbl2.フィールドB, 
count(tbl2.フィールドB) cnt2,
 from
テーブル tbl1,
テーブル tbl2
where 
tbl1.フィールドA = tbl2.フィールドA
and tbl1.フィールドB = tbl2.フィールドB
 group by 
tbl1.フィールドA, tbl2.フィールドB

Where句のところはPKでつなげて…

なんてやり方もあるとは思いますが、

テーブルの構成にもよりますが、こんな風にくっつけなきゃいけないのをやるんだったら、複数回発行した方がよさそう…かなと思います。すべてのフィールドにキーが張ってあるともおもえないし…

◎質問者からの返答

悩んでいたのですが、ご意見を聞いてすっきりしました。

いつも、ありがとうございます。

また、よろしくお願いします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ