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

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

ただいまの
回答率

89.85%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 163

narugaro

score 1

【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        不参加

現在のソースコード

$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;
}

出力結果

 1 2 2

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/10/04 14:54

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

    キャンセル

  • m.ts10806

    2019/10/04 14:56

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

    キャンセル

  • narugaro

    2019/10/04 15:11

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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


してください

参考までに

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


だと思います

テーブルの設計から

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

無理やりやってみる

create table at_postmeta(post_id int,meta_key varchar(10),meta_value varchar(10));
insert into at_postmeta values
(1,'イベント名','役員会議'),
(1,'名前','山田太郎'),
(1,'件名1','参加'),
(1,'件名2','不参加'),
(2,'イベント名','役員会議'),
(2,'名前','田中花子'),
(2,'件名1','参加'),
(2,'件名2','参加'),
(3,'イベント名','合同イベント'),
(3,'名前','鈴木一郎'),
(3,'件名1','不参加'),
(3,'件名2','不参加');
  • 検索
select post_id,名前,件名1,参加1,件名2,参加2
from (
select t1.post_id,
group_concat(case meta_key when "名前" then meta_value else null end) 名前,
group_concat(case meta_key when "件名1" then meta_value else null end) 件名1,
group_concat(case meta_key when "件名2" then meta_value else null end) 件名2
from at_postmeta as t1
inner join (select post_id from at_postmeta where meta_key='イベント名' and meta_value='役員会議') as t2
on t1.post_id=t2.post_id
group by post_id
) as sub1 right join (
select t1.post_id,
sum((meta_key="件名1")*(meta_value="参加")) 参加1,
sum((meta_key="件名2")*(meta_value="参加")) 参加2
from at_postmeta as t1
inner join (select post_id from at_postmeta where meta_key='イベント名' and meta_value='役員会議') as t2
on t1.post_id=t2.post_id
group by post_id
with rollup
) as sub2  using(post_id)
  • 結果
post_id 名前 件名1 参加1 件名2 参加2
1 山田太郎 参加 1 不参加 0
2 田中花子 参加 1 参加 1
NULL NULL NULL 2 NULL 1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/04 15:34

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

    ありがとうございました!

    キャンセル

  • 2019/10/04 15:42

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

    キャンセル

  • 2019/10/04 16:08

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

    キャンセル

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

  • ただいまの回答率 89.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる