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


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

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

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

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

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

回答の条件
  • 1人5回まで
  • 登録:2006/06/06 22:09:13
  • 終了:2006/06/08 11:30:44

ベストアンサー

id:kuippa No.3

くいっぱ回答回数1030ベストアンサー獲得回数132006/06/07 23:48:27

ポイント70pt

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

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


フィールド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でつなげて…

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

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

id:black_kenchan

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

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

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

2006/06/08 11:30:14

その他の回答(2件)

id:llusall No.1

llusall回答回数505ベストアンサー獲得回数612006/06/06 22:43:32

ポイント5pt

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

次のような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 テーブル

id:black_kenchan

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

2006/06/06 22:46:43
id:falcosapiens No.2

falcosapiens回答回数126ベストアンサー獲得回数132006/06/07 00:25:47

ポイント5pt

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

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

id:kuippa No.3

くいっぱ回答回数1030ベストアンサー獲得回数132006/06/07 23:48:27ここでベストアンサー

ポイント70pt

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

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


フィールド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でつなげて…

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

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

id:black_kenchan

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

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

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

2006/06/08 11:30:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません