🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

PHP

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

Q&A

解決済

1回答

1724閲覧

【PHP】MySQLから条件指定で取得した値(while内)の合計値を表示したい

narugaro

総合スコア5

MySQL

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

PHP

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

0グッド

0クリップ

投稿2019/10/04 05:14

編集2019/10/04 05:44

【PHP】MySQLから条件指定で取得した値の合計値を表示したい

データベースに下記の情報があります。参加人数の合計を表示したいのです。

テーブル at_postmeta

post_id meta_key meta_value 1 イベント名 役員会議 1 名前 山田太郎 1 件名1 参加 1 件名2 不参加 2 イベント名 役員会議 2 名前 田中花子 2 件名1 参加 2 件名2 参加 3 イベント名 合同イベント 3 名前 鈴木一郎 3 件名1 不参加 3 件名2 不参加

現在のソースコード

php

1$title = '役員会議'; 2$event_name = "イベント名"; 3$sql = "SELECT * 4 FROM at_postmeta 5 WHERE meta_key = '$event_name' 6 AND meta_value = '$title'"; 7$result1 = mysql_query($sql); 8 9while ($row = mysql_fetch_assoc($result1)) { 10 $post_id = $row['post_id']; 11 $label1 = "件名1"; 12 $sanka = "参加"; 13 14 $sql = "SELECT COUNT(meta_value = '$sanka' OR null) AS cnt 15 FROM at_postmeta 16 WHERE post_id = '$post_id' 17 AND meta_key = '$label1' 18 "; 19 $result = mysql_query($sql); 20 21 while ($row = mysql_fetch_assoc($result)){ 22 $sum += $row['cnt']; 23 } 24 echo $sum; 25}

出力結果

1 2 2

この最終的な合計値である「2」のみを表示させたいのですが、while文であるため、どうしてもループ処理で表示されてしまいます。。
お手数ですが、ご教授いただけると助かります。

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

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

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

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

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

yoorwm

2019/10/04 05:17

出力箇所が1カ所しか無いのですが、どのように実行させたのでしょうか?
narugaro

2019/10/04 05:19

すみません、一部を切り取って投稿したので上のwhile文もつけました。 他の条件で絞り込んだ物の中で回しています。
m.ts10806

2019/10/04 05:20

「参加」のsum() ではダメなんでしょうか。取得しないと計算できないようには思えませんが
narugaro

2019/10/04 05:22

「参加」のsum()にすると、件名1と件名2の合計になってしまうのです。 件名1の参加人数、件名2の参加人数と分けて表示したいです。
m.ts10806

2019/10/04 05:54

sumしたあとGroup by で締められそうに思います。
m.ts10806

2019/10/04 05:56

それか、それぞれ単体で集計したものをjoinするとか いずれにしてもSQLでなんとかしたほうがスッキリしそうに思います
narugaro

2019/10/04 06:11

Group byも試してみたのですが、ちょっと意図が違う感じでした。 普段はWordPressのテンプレートを触るくらいの知識なので、DB接続してコードを書くのに分からないことだらけで。。すみません。
guest

回答1

0

ベストアンサー

mysql_系の関数をつかっています?
話にならないくらい古いので環境再構築を検討ください

ちなみにmysqlのレコードの中で更にmysqlで検索するって
ちょっと意図がわかりません
すなおに

SQL

1SELECT count(*) AS cnt 2FROM at_postmeta 3WHERE meta_value = '参加'and meta_key = '件名1'

してください

参考までに

SQL

1COUNT(meta_value = '$sanka' OR null) AS cnt 2↓↓↓ 3SUM(meta_value = '$sanka') AS cnt

だと思います

テーブルの設計から

SQL

1create table tbl(id int primary key, 2イベント名 varchar(10), 3名前 varchar(10), 4件名1 varchar(10), 5件名2 varchar(10)); 6insert into tbl values 7(1,'役員会議','山田太郎','参加','不参加'), 8(2,'役員会議','田中花子','参加','参加'), 9(3,'合同イベント','鈴木一郎','不参加','不参加');

無理やりやってみる

SQL

1create table at_postmeta(post_id int,meta_key varchar(10),meta_value varchar(10)); 2insert into at_postmeta values 3(1,'イベント名','役員会議'), 4(1,'名前','山田太郎'), 5(1,'件名1','参加'), 6(1,'件名2','不参加'), 7(2,'イベント名','役員会議'), 8(2,'名前','田中花子'), 9(2,'件名1','参加'), 10(2,'件名2','参加'), 11(3,'イベント名','合同イベント'), 12(3,'名前','鈴木一郎'), 13(3,'件名1','不参加'), 14(3,'件名2','不参加');
  • 検索

SQL

1select post_id,名前,件名1,参加1,件名2,参加2 2from ( 3select t1.post_id, 4group_concat(case meta_key when "名前" then meta_value else null end) 名前, 5group_concat(case meta_key when "件名1" then meta_value else null end) 件名1, 6group_concat(case meta_key when "件名2" then meta_value else null end) 件名2 7from at_postmeta as t1 8inner join (select post_id from at_postmeta where meta_key='イベント名' and meta_value='役員会議') as t2 9on t1.post_id=t2.post_id 10group by post_id 11) as sub1 right join ( 12select t1.post_id, 13sum((meta_key="件名1")*(meta_value="参加")) 参加1, 14sum((meta_key="件名2")*(meta_value="参加")) 参加2 15from at_postmeta as t1 16inner join (select post_id from at_postmeta where meta_key='イベント名' and meta_value='役員会議') as t2 17on t1.post_id=t2.post_id 18group by post_id 19with rollup 20) as sub2 using(post_id)
  • 結果
post_id名前件名1参加1件名2参加2
1山田太郎参加1不参加0
2田中花子参加1参加1
NULLNULLNULL2NULL1

投稿2019/10/04 05:25

編集2019/10/04 06:57
yambejp

総合スコア116690

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

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

narugaro

2019/10/04 05:42

ご丁寧にありがとうございます。 質問をするのがはじめてで、どのようにしたら良いのか分からず、伝えきれていないのですが、実際はDBテーブル内は下記のように他の要素があります。 ``` post_id meta_key meta_value 1 イベント名 役員会議 1 名前 山田太郎 1 件名1 参加 1 件名2 不参加 2 イベント名 役員会議 2 名前 田中花子 2 件名1 参加 2 件名2 参加 3 イベント名 合同イベント 3 名前 鈴木一郎 3 件名1 不参加 3 件名2 不参加 ``` その中で、イベント名で絞り込み、そのイベントの中でidを絞り込み、 ``` 名前   件名1  件名2 山田太郎 参加  不参加 田中花子 参加  参加 ----- 参加人数 2名  1名 ``` の表を作り、件名1の参加人数・件名2の参加人数を表示させようとしています。。 ``` $title = '役員会議'; $event_name = "イベント名"; $sql = "SELECT * FROM at_postmeta WHERE meta_key = '$event_name' AND meta_value = '$title'"; $result1 = mysql_query($sql); while ($row = mysql_fetch_assoc($result1)) { $post_id = $row['post_id']; $label1 = "件名1"; $sanka = "参加"; $sql = "SELECT COUNT(meta_value = '$sanka' OR null) AS cnt FROM at_postmeta WHERE post_id = '$post_id' AND meta_key = '$label1' "; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)){ $sum += $row['cnt']; } echo $sum; } ```
yambejp

2019/10/04 05:54

なんかテーブル設計がおかしいですよ 普通に項目を横方向に伸ばせばいいでしょう。 ご提示の方式はカラムが動的にガンガン変わる場合などのものです
narugaro

2019/10/04 05:55

ありがとうございます。。 WordPressで作られているので、テーブルはこちらで変更できないのです。
narugaro

2019/10/04 05:55

WordPressのフォームに登録された出欠の情報をHTMLの表にして表示させる仕組みです。
yambejp

2019/10/04 06:06

役員会議の、件名1と件名2のそれぞれの参加者を確認すればよいですか?
narugaro

2019/10/04 06:09

はい、実際のコードでは、$title = '役員会議';のところが変動し、様々なイベントの、「件名1と件名2のそれぞれの参加者」を確認する形になります。
narugaro

2019/10/04 06:34

すみません、while文の外で記載場所を変更したところ、合計値が表示されました。 お騒がせしました。 ありがとうございました!
yambejp

2019/10/04 06:42

命題で提示されたままのテーブル形式で一発で取る方法を追記しました
narugaro

2019/10/04 07:08

お手数おかけしましたm(_ _)m ありがとうございます!! わたしのコードは複雑になっているので、教えてもらったものを参考に少しシンプルにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問