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

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

ただいまの
回答率

87.80%

php DBから取得した値を用いて演算

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 7,653

score 32

前提・実現したいこと

Unity、phpを用いて、システム開発の勉強を行っています。
今回は、Unityへデータを送信する前に、phpでMySQLから取得したデータを編集してからJSONへ変換してUnityへpostしたいと考え、試行錯誤してきましたが、行き詰ってしまったため、皆様のお力をお借りしたいと思い、質問させていただきました。

実現したいことは、
MySQLから取得したデータのなかで、同じ値を示すday_idのデータをまとめ、
maruとbatuの合計値を求めてからJSON形式に変換したいと考えています。

今回はDBでnum1とnum2の値が1のデータを取得してきています。 
取得したデータは、day_id、maru、batu、の3つで,その値は、下記のtest.phpに記載しています。
今回はday_idが「1」である2人のデータのmaruとbatuの値を足し算してからJSONに変換し、Unityへpostしたいと考えています。

該当のソースコード

test.php

<?php
require_once('config.php');
require_once('functions.php');

$num1 = 1;
$num2 = 1;

$dbh = connectDb();


$sth = $dbh->prepare("SELECT day_id, maru, batu FROM data WHERE num1 = ? AND num2 = ?");
$sth->execute([$num1,$num2]);

//取得できたデータは3人分あり、それぞれday_id, maru, batuの順に
//1 , 8 , 7
//1 , 6 , 9
//2 , 10 , 5
//となっている

//配列に入れる前にday_idが同じ人のデータの、maruとbatuの値を合計したい

$Data = array();
while($row = $sth->fetch(PDO::FETCH_ASSOC)){
    $Data[]=array(
    'day_id'=>$row['day_id'],
    'maru'=>$row['maru'],
    'batu'=>$row['batu'],
    );
}

///jsonとして出力

header('Content-type: application/json');
echo json_encode($Data);
?>

考えたこと

まだプログラミングを始めたばかりのため、phpの知識はまだ浅く、SELCTして取得したデータを、配列に格納する前に加算、減算、乗算、除算に用いることができるのか分かりません。
新たに変数SUMを作成し、day_idが同じ人のmaruとbatuの合計数をSUMに格納してから、$Dataに格納すればよいのか、とも考えました。
また、phpでは計算などはせず、postするC#の方で処理をするべきなのでしょうか。
正直どうしてよいのかわかりません。

拙い説明ではありますが、ご教授お願いできますでしょうか。
よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

集約結果だけ取得できれば良いということでしたら、
SQL(MySQLへのSELECT句)のみで集計結果を取得することが可能です。

集計を行う場合はGROUP BY句を、
合計値の集計結果を取得する場合はSUM関数を利用すると良いかと思います。

・補足
少々注意してほしい点があるので、
一応サンプルを掲示しておきます。

SELECT id, SUM(col1) AS total
FROM table
WHERE col2 = 1
GROUP BY id

上記のようなSQLの場合、
PHP側で配列から値を取り出す場合下記のようになります。

// 以下はフェッチ後のサンプル変数$rowにフェッチしたと想定
$id = $row['id'];
$total = $row['total']; // SQLの「AS」以降に指定した別名で取得
//$total = $row['SUM(col1)']; ← 別名をつけないと左記のように取得しなければならない

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/18 00:38

    Panzer_vor様
    ご回答ありがとうございます。
    GROUP BY句でまとめることができること、始めて知りました。
    おかげさまでday_idが同じ人のデータをまとめることができ、
    さらに、maruの合計値とbatuの合計値も求めることができ、行いたい処理が無事できました。
    ご丁寧に注意点も書いていただき、とても分かりやすかったです。
    ありがとうございました。
    勉強になりました。

    キャンセル

+2

SQLですませていいならこんなかんじ?

$sth = $dbh->prepare("SELECT day_id, sum(maru) as maru, sum(batu) as batu FROM data WHERE num1 = ? AND num2 = ? group by day_id");


--- 追加 ---
//かぶったのでコードの方も(^_^;

$Data = array();
while($row = $sth->fetch(PDO::FETCH_ASSOC)){
    $id = $row['day_id'];
    if (!isset($Data[$id]) {
      $Data[$id] = array();
      $Data[$id]['maru'] = 0;
      $Data[$id]['batu'] = 0;
    }
    $Data[$id]['maru'] += $row['maru'];
    $Data[$id]['batu'] += $row['batu'];
}

$Data2 = array();
foreach ($Data as $k=>$a) {
    $Data2[] = array(
    'day_id'=>$k,
    'maru'=>$a['maru'],
    'batu'=>$a['batu'],
    );
}


//あ、こっちはSQLそのままって前提です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/18 00:42

    takasima20様
    ご回答ありがとうございます。
    今回はSQL句でGROUP BYとSUM関数を用いて処理を行うことにしました。
    無事行いたい処理が実行できました。
    まだプログラミングを始めたばかりのため、二次元配列は私には少し難しかったようです…丁寧に教えていただいたにも関わらず、私の理解が及ばす申し訳ございません…
    今後一生懸命勉強していきたいと思います。
    ありがとうございました。

    キャンセル

  • 2016/09/18 05:52

    (・∀・)b

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る