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

PHP MySQL Ver 5.0~

製品評価をMySQLに保存しています。

テーブル内容は以下のような感じです:

製品番号|商品名前|評価1|評価2|評価3|コメント|

各評価は数字で行われ、0〜各評価毎の最高点 で行われます。

例えば 評価1の場合、最低は0で最高は3だとします。
一方、評価2の場合は、0〜9とします。
又、評価3の場合は、ちょっと異なり、0〜3なのですが、評価の仕方が
0:地域需要に対して良い 1:国内需要に対しては良い 2:国外需要に対しては良い 3:生産中止を考慮すべき
で、3だけの場合もあれば、0-1 という評価もインサートされている場合があります。

この集計を出来るSQLを教えて下さい。
例えばレコードが10000件登録されているとして、
評価1の結果→0:23パーセント、1:27パーセント、2:60パーセント、3:0パーセント
という結果を表示したいのです。


ちなみに負荷対策のため、JOINは使用できません。

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


●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP SQL コメント パーセント
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● 敷守ほむら
●27ポイント

PHPとMySQLとの組み合わせなら、件数だけMySQLで出して、パーセントの計算はPHPに任せた方がいいのではないでしょうか?

つまり、例えば評価1だけについてそれぞれのパーセントを表示するなら、

(製品番号がかぶらないという前提で)

1)

select 評価1, count(製品番号) as 件数 from 製品評価テーブル group by 評価1 order by 評価1

というSQL文を発行して、PHP側の配列に格納

2)

件数のフィールドを全て足すと全体の件数が判るから、

できた配列について、評価1ごとの件数を全体の件数で割ってパーセントを計算


2 ● pahoo
●27ポイント

「評価*」のデータ型は文字列で、'0' や '0-1' が入るという前提ですよね。

また、'0-1' の場合は、'0' と '1' の両方でカウントする(つまり、パーセント数の合計は100以上になることがある)という前提で良いですか。


であれば、評価1の結果が0である件数の割合(パーセント)を計算する SQL 文は以下の2行です。

select @cnt:=count(*) from テーブル;
select (count(*) / @cnt * 100) from テーブル where 評価1 like '%0%';

1である場合を計算するには、2行目の末尾を "where 評価1 like '%1%'"

2である場合を計算するには、2行目の末尾を "where 評価1 like '%2%'"

‥‥

以下、同様です。


3 ● Mook
●26ポイント

実行環境がわからないので、同一セッション内であれば下記のように実行できます。

SELECT count(*) INTO @totalNumber FROM 製品評価;
SELECT 評価1, CONCAT( ROUND( COUNT(評価1) / @totalNumber * 100, 2 ), '%' ) As '割合' FROM 製品評価 GROUP BY 評価1 ORDER BY 評価1;
SELECT 評価2, CONCAT( ROUND( COUNT(評価2) / @totalNumber * 100, 2 ), '%' ) As '割合' FROM 製品評価 GROUP BY 評価2 ORDER BY 評価2;
SELECT 評価3, CONCAT( ROUND( COUNT(評価3) / @totalNumber * 100, 2 ), '%' ) As '割合' FROM 製品評価 GROUP BY 評価3 ORDER BY 評価3;

SELECT 文ごとに結果を出力するので、ファイルに出力するか、一つずつ順番に実行ください。


うまくいかない場合はご使用のDBのバージョンと、クエリをどのような環境で実行しているかをコメントください。

関連質問


●質問をもっと探す●



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