Mysql,php,smartyを利用したec系のサイトを作成中です。そのサイトの商品一覧ページの各商品の行にその商品に関するある作業を終了したパーセンテージを算出した結果を表示するカラムを設定したいと考え、その計算に関する記述方法を思案しています。
まず商品テープルtbl_productにjob1からjob10という名称で10個のカラムを設け、そのカラムに1か2の値を設定するようにし、値が2であればその作業は終了したとする設定に致しました。 この作業が10の作業中何個終了したか(tbl_product 内のjob 1~ job 10の10個のカラムの中でフィールドが2に設定されている割合)を計算する記述をどのようなファイル(php、smarty)を使用し、どのように記述すれば宜しいかご教示頂けませんでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
私なら以下のようなSQLを作成します。
テーブル構成は他の方が書いたものを想定しています。
SQL
1--テーブルCREATE文 2CREATE TABLE tbl_product( 3 id int auto_increment 4 , name varchar (10) 5 , job1 int 6 , job2 int 7 , job3 int 8 , job4 int 9 , job5 int 10 , job6 int 11 , job7 int 12 , job8 int 13 , job9 int 14 , job10 int 15 , PRIMARY KEY (id) 16);
SQLServer的な書き方をしていますが、雰囲気で。動作確認もしていません^^;
jobが10個なのでjob一つで進捗率が10%として計算を簡単にしています。
対象の商品IDがわかっている場合は条件でidをINで指定する事を想定しています。
SQL
1SELECT id,COUNT(*) * 10 AS progress_per FROM ( 2 SELECT id,1 AS job_id,job1 AS job_stat from tbl_product --WHERE id IN (...) 3 UNION ALL 4 SELECT id,2 AS job_id,job2 AS job_stat from tbl_product --WHERE id IN (...) 5 UNION ALL 6 SELECT id,3 AS job_id,job3 AS job_stat from tbl_product --WHERE id IN (...) 7 UNION ALL 8 SELECT id,4 AS job_id,job4 AS job_stat from tbl_product --WHERE id IN (...) 9 UNION ALL 10 SELECT id,5 AS job_id,job5 AS job_stat from tbl_product --WHERE id IN (...) 11 UNION ALL 12 SELECT id,6 AS job_id,job6 AS job_stat from tbl_product --WHERE id IN (...) 13 UNION ALL 14 SELECT id,7 AS job_id,job7 AS job_stat from tbl_product --WHERE id IN (...) 15 UNION ALL 16 SELECT id,8 AS job_id,job8 AS job_stat from tbl_product --WHERE id IN (...) 17 UNION ALL 18 SELECT id,9 AS job_id,job9 AS job_stat from tbl_product --WHERE id IN (...) 19 UNION ALL 20 SELECT id,10 AS job_id,job10 AS job_stat from tbl_product --WHERE id IN (...) 21) job_stat_list 22WHERE job_stat = 2 23GROUP BY id;
投稿2015/07/15 16:50
総合スコア85
0
ベストアンサー
SQLだけで十分でしょう。
job 1~ job 10の合計から10引くことで終了した作業の個数がわかるので、以下のように割合を求めることができます。
lang
1CREATE TABLE tbl_product( 2 id int auto_increment 3 , name varchar (10) 4 , job1 int 5 , job2 int 6 , job3 int 7 , job4 int 8 , job5 int 9 , job6 int 10 , job7 int 11 , job8 int 12 , job9 int 13 , job10 int 14 , PRIMARY KEY (id) 15); 16 17 18SELECT 19 id 20 , name 21 , concat( 22 ( 23 job1 + job2 + job3 + job4 + job5 + job6 + job7 + job8 + job9 + job10 - 10 24 ) / 10 * 100 25 , '%' 26 ) result 27FROM 28 tbl_product;
さらに、jobを別テーブルに持ち、作業の終了を真偽値で持つことにより、次のようにテーブル構造が簡潔になり、jobの増減にも対応できます。
lang
1create table tbl_product( 2 id int auto_increment 3 , name varchar (10) 4 , PRIMARY KEY (id) 5); 6 7create table tbl_product_jobs( 8 id int 9 , job_no int 10 , is_finished boolean 11 , PRIMARY KEY (id,job_no) 12 , FOREIGN KEY (id) REFERENCES tbl_product(id) 13); 14 15SELECT 16 tp.id 17 , tp.name 18 , CONCAT(SUM(tpj.is_finished) / COUNT(*) * 100, '%') 19FROM 20 tbl_product tp 21 LEFT JOIN tbl_product_jobs tpj 22 ON tp.id = tpj.id 23GROUP BY 24 id;
投稿2015/07/13 04:53
総合スコア3541
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/13 11:49
2015/07/14 08:04 編集
2015/07/14 08:44
2015/07/19 02:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/16 07:39
2015/07/16 09:03
2015/07/16 22:57 編集
2015/07/17 02:07
2015/07/19 02:47 編集