質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

2回答

2407閲覧

Db(mysql)の商品テーブルに作成した10個のカラムのフィールドが特定の値に設定されている割合を計算する記述をご教示いただけませんでしょうか。

nouzo

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2015/07/12 08:01

編集2015/07/12 08:14

Mysql,php,smartyを利用したec系のサイトを作成中です。そのサイトの商品一覧ページの各商品の行にその商品に関するある作業を終了したパーセンテージを算出した結果を表示するカラムを設定したいと考え、その計算に関する記述方法を思案しています。

まず商品テープルtbl_productにjob1からjob10という名称で10個のカラムを設け、そのカラムに1か2の値を設定するようにし、値が2であればその作業は終了したとする設定に致しました。 この作業が10の作業中何個終了したか(tbl_product 内のjob 1~ job 10の10個のカラムの中でフィールドが2に設定されている割合)を計算する記述をどのようなファイル(php、smarty)を使用し、どのように記述すれば宜しいかご教示頂けませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

HachiyaKouya

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nouzo

2015/07/16 07:39

HachiyaKouya様 ご指導いただきまして感謝いたします。現在あれこれと試している最中でございますが、頂きました記述を試しましたところ下記のメッセージがでました。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( SELECT id , 1 AS job_id , job1 AS job_stat from tbl_product ' at line 1 mysql仕様と異なるためかどうかと考えておりますが、上記のメッセージはmysql仕様に変更すれば直るものでしょうか。もしそうであれば、どこを変更すれば宜しいでしょうか。
HachiyaKouya

2015/07/16 09:03

お返事ありがとうございます。 本日、MySQLWorkbenchで試したところ、UNION ALLでつなげているSELECT文各行のコメントを意図した文字列 > --WHERE id IN (...) を削除したところ実行できました。 コメントの書き方がMySQLで認識できない形式だったようです。 以下に私の環境で実行できたSQLを記載します。 ```SQL SELECT id,COUNT(*) * 10 AS progress_per FROM ( SELECT id,1 AS job_id,job1 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,2 AS job_id,job2 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,3 AS job_id,job3 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,4 AS job_id,job4 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,5 AS job_id,job5 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,6 AS job_id,job6 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,7 AS job_id,job7 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,8 AS job_id,job8 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,9 AS job_id,job9 AS job_stat from tbl_product --WHERE id IN (...) UNION ALL SELECT id,10 AS job_id,job10 AS job_stat from tbl_product --WHERE id IN (...) ) job_stat_list WHERE job_stat = 2 GROUP BY id; ```
nouzo

2015/07/16 22:57 編集

HachiyaKouya様 ご指導いただきまして感謝致します。複雑になり恐縮ですがいくつかご質問がございます。 ①“--WHERE id IN (...)” を削除して実行するということでよろしいですよね?  ②WHERE job_stat = 2は具体的にどうゆうことでしょうか。 ③idは質問文の簡略化のため使用しただけで、実際はproduct_id。実行の際はproduct_idで実行していますが問題ないですよね。 ④最後に頂きました記述を実行いたしますと、エラーメッセージもでない代わりに、検索結果が空欄になります。 行おうとしている事をもう一度確認させて頂きますと、各行に異なる商品が表示される商品一覧ページを作成しよとしております。その各商品の行の列にカラムを作成しようとしております。そのカラムには各々の商品に関する最小で2、最大で22まで変則的に増減する仕事が終了した割合を計算した結果を表示いたします(product_id、name、job1~job22はtbl_product内にある)。 以上の条件で、sho_cs様から頂きました以下の式は“仕事が10存在し、その10の内いくつ終了したかを計算する“という条件のもと正しい計算結果をmysqlのSQLタブで表示致し、商品一覧ページの各商品の行のカラムにもそれぞれ表示します。 SELECT product_id , name , concat( ( job1 + job2 + job3 + job4 + job5 + job6 + job7 + job8 + job9 + job10 - 10 ) / 10 * 100 , '%' ) result FROM tbl_product; 実際実行した記述は以下です。comp_nとcomp_sは必須の仕事で、comp_s1からcomp_sc10は変則的に増減します。 SELECT product_id,COUNT(*) * 22 AS progress_per FROM ( SELECT product_id,1 AS job_id,comp_n AS job_stat from tbl_product UNION ALL SELECT product_id,2 AS job_id,comp_c AS job_stat from tbl_product UNION ALL SELECT product_id,3 AS job_id,comp_s1 AS job_stat from tbl_product UNION ALL SELECT product_id,4 AS job_id,comp_s2 AS job_stat from tbl_product UNION ALL SELECT product_id,5 AS job_id,comp_s3 AS job_stat from tbl_product UNION ALL SELECT product_id,6 AS job_id,comp_s4 AS job_stat from tbl_product UNION ALL SELECT product_id,7 AS job_id,comp_s5 AS job_stat from tbl_product UNION ALL SELECT product_id,8 AS job_id,comp_s6 AS job_stat from tbl_product UNION ALL SELECT product_id,9 AS job_id,comp_s7 AS job_stat from tbl_product UNION ALL SELECT product_id,10 AS job_id,comp_s8 AS job_stat from tbl_product UNION ALL SELECT product_id,11 AS job_id,comp_s9 AS job_stat from tbl_product UNION ALL SELECT product_id,12 AS job_id,comp_s10 AS job_stat from tbl_product UNION ALL SELECT product_id,13 AS job_id,comp_sc1 AS job_stat from tbl_product UNION ALL SELECT product_id,14 AS job_id,comp_sc2 AS job_stat from tbl_product UNION ALL SELECT product_id,15 AS job_id,comp_sc3 AS job_stat from tbl_product UNION ALL SELECT product_id,16 AS job_id,comp_sc4 AS job_stat from tbl_product UNION ALL SELECT product_id,17 AS job_id,comp_sc5 AS job_stat from tbl_product UNION ALL SELECT product_id,18 AS job_id,comp_sc6 AS job_stat from tbl_product UNION ALL SELECT product_id,19 AS job_id,comp_sc7 AS job_stat from tbl_product UNION ALL SELECT product_id,20 AS job_id,comp_sc8 AS job_stat from tbl_product UNION ALL SELECT product_id,21 AS job_id,comp_sc9 AS job_stat from tbl_product UNION ALL SELECT product_id,22 AS job_id,comp_sc10 AS job_stat from tbl_product ) job_stat_list WHERE job_stat = 2 GROUP BY product_id;
HachiyaKouya

2015/07/17 02:07

お返事ありがとうございます。 以下に回答します。 > ①“--WHERE id IN (...)” を削除して実行するということでよろしいですよね? そうです。 そうすると、テーブル内の商品全件のデータが抽出されます。 対象の商品IDが決まっているのであれば各行にWHERE文を指定して商品を限定すると良い、という意図でコメントとして記載しました。 > ②WHERE job_stat = 2は具体的にどうゆうことでしょうか。 UNION ALLで連結している各SELECT文は、商品を特定する情報と複数あるjobのうち特定の一つの値を取得するSQLです。 job状態のカラム名はそれぞれ違うものですので、job_statという別名をつけています。 このSQLは、1レコードに1商品の全てのjobの状態が横並びになっているものを、商品ごと・ジョブ1つの状態で複数レコードのテーブルとして扱う想定です。 商品ID,job1,job2,job3... というレコードを 商品ID,job1 商品ID,job2 商品ID,job3 ... というテーブルに変換して処理しています。 その変換後のテーブルからjob各カラムの値が2のものの個数を取得しています。 > ③idは質問文の簡略化のため使用しただけで、実際はproduct_id。実行の際はproduct_idで実行していますが問題ないですよね。 はい、問題ありません。 あくまでもサンプルですので、用途に合わせて最適化してください。 > ④最後に頂きました記述を実行いたしますと、エラーメッセージもでない代わりに、検索結果が空欄になります。 テーブルが空、もしくはjob1~10に2が設定されているものが無いのではないかと思います。 なお、私が記載したSQLはjobが1~10の10個で固定という前提が必要ですので、おっしゃるような2個から22個の範囲内で可変というのであればSQLはもっと複雑になります。 複雑なSQLを書くのであれば、PHPで処理してそれぞれシンプルにするほうが後々のメンテナンスが楽ではないかと思いますが、PHPと組み合わせての例は。。。例示できるのは早くても明日になるかと^^;
nouzo

2015/07/19 02:47 編集

HachiyaKouya様 ご指導いただきまして感謝いたします。
guest

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

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nouzo

2015/07/13 10:21 編集

sho_cs様 ご多忙の中ご教示いただきまして感謝いたします。 頂きました記述を利用して、一連の流れを自動的に処理したい場合、(例えば、全体のjobのフィールドが1(すみません、defaultが2で終了は1でした。)に設定された数が3から4になった際の計算を自動処理したい場合、最終的にtpl上に表示する為に)具体的にはどのようにすれば宜しいでしょうか。
sho_cs

2015/07/13 11:49

既存のphp、tplの記載がないので具体的には難しいですが以下の作業が必要となるはずです。 ・商品一覧を取得するSQLに上記回答を参考に作業の終了率を返す部分を追加 ・tplに作業の終了率を表示する列を追加
nouzo

2015/07/14 08:04 編集

sho_cs様、 ご指導感謝致します。計算結果をtpl上に表示できました。 しかしながら、大変申し訳ございませんが、jobが変則的に増減するということ自体を忘れておりました。 厳密には、ある商品に対して、jobが最低で2あり、それが最大22までになります。Jobが2の時もあれば22の時もあり、つまり2の時は1/2なのか、あるいは10の時は7/10なのか、あるいは22の時は18/22なのかといった具合に一つの商品に対するjobの数が変則的な中で、その内いくつ終了したかを算出したいです。 上記の条件の場合、頂きました記述の二つ目のSQLは利用可能でしょうか。 もし可能である場合、その中に tbl_product_jobsのjob_noとありますが、それは一つの商品にある2~22までの間で変則的に変わり得るjobの内でどのように番号を作成するのでしょうか。
sho_cs

2015/07/14 08:44

二つ目のSQLは利用可能なはずです。 番号の作成は一つの商品(同一id)に対してjobの個数分レコードを登録します。 id=1はjobが2つ、id=2はjobが4つの場合、以下のようになります。 id=1,job_no=1,... id=1,job_no=2,... id=2,job_no=1,... id=2,job_no=2,... id=2,job_no=3,... id=2,job_no=4,...
nouzo

2015/07/19 02:24

sho_cs様 ご指導いただきまして感謝いたします。いろいろな方法で試しておりました。現在tbl_product_jobsにデータを挿入させようとしておりますが、jobの増減に対応する記述自体は機能しているように思われます。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問