こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

内部結合のSELECTで取得した配列をわかりやすく

商品情報が入ったテーブルが2つあります。

一つは商品のスペックが入ったテーブル → tb_spec
一つは商品の種類と価格が入ったテーブル → tb_variation

tb_spec
----------------
商品ID, 重量
item001, 100
item002, 150
----------------

tb_variation
----------------
色, 商品ID, 価格
赤, item001, 12000
青, item001, 15000
黒, item002, 21000
白, item002, 20000
赤, item002, 23000
----------------

これを一致する商品IDで内部結合でのSELECTで抽出します。

 SELECT s.`商品ID`, s.`重量`, v.`色`, v.`価格`
  FROM tb_spec AS s
  INNER JOIN tb_variation AS v
  ON s.`商品ID` = v.`商品ID`

結果は、

 Array(
  [0] => Array ([商品ID] =>item001 [重量] =>100 [色] =>赤 [価格] =>12000)
  [1] => Array ([商品ID] =>item001 [重量] =>100 [色] =>青 [価格] =>15000)
  [2] => Array ([商品ID] =>item002 [重量] =>100 [色] =>黒 [価格] =>21000)
  [3] => Array ([商品ID] =>item002 [重量] =>100 [色] =>白 [価格] =>20000)
  [4] => Array ([商品ID] =>item002 [重量] =>100 [色] =>赤 [価格] =>23000)
 )

というように結果が帰ってきます。
これを、

 Array(
  [0] => Array ([商品ID] =>item001 [重量] =>100 [色] => Array(
      [赤] => Array([価格] =>12000)
      [青] => Array([価格] =>15000)
  )
  [1] => Array ([商品ID] =>item002 [重量] =>100 [色] => Array(
      [黒] => Array([価格] =>21000)
      [白] => Array([価格] =>20000)
      [赤] => Array([価格] =>23000)
  )
 )

というように商品ID毎の配列で取得できるSQL文は書けるのでしょうか?
上記と多少配列の構造が変わっても良いのですが、商品ID毎に取得できればと思っています。

どうぞよろしくお願い致します。

投稿日時 - 2014-01-27 15:03:08

QNo.8449110

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

ちなみにこんな感じ?

$sql="・・・";
$temp=array();
$datas=array();
foreach ($conn->query($sql) as $row) {
$data=Array ("商品ID" =>$row["商品ID"],"重量" =>$row["重量"]);
if(!in_array($data,$temp)) $temp[]=$data;
$key=array_search($data,$temp);
$datas[$key]["色"][$row["色"]]=array("価格"=>$row["価格"]);
}
print_r($datas);

投稿日時 - 2014-01-27 17:30:11

お礼

わざわざコードも頂きましてありがとうございます。
PHP側で加工すれば好きな構造にできますからね。
全てクエリーの結果を頼らなくてもいいかもしれません。
参考にさせていただきたいと思います。

投稿日時 - 2014-01-27 18:15:23

ANo.1

これはPHP側でデータを配列に格納する際にやれば済む話では?

投稿日時 - 2014-01-27 15:36:58

お礼

ありがとうございます。
そうですね、PHPが側でやってもよかった話ではありますね…。
あれから試行錯誤してPDOでなんとなくうまく出来た気がします。

 $query = "
  SELECT s.`商品ID`, s.`重量`, v.`色`, v.`価格`
   FROM tb_spec AS s
   INNER JOIN tb_variation AS v
   ON s.`商品ID` = v.`商品ID`
  ;";
 
 $pr = $pdo->prepare($query);
 $pr->execute();
 $row = $pr->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_GROUP);

結果は、

 Array(
  [商品ID] => Array(
    item001 => Array(
      [0] => Array([重量] =>100 [色] =>赤 [価格] =>12000)
      [1] => Array([重量] =>100 [色] =>青 [価格] =>15000)
    )
    item002 => Array(
      [0] => Array([重量] =>150 [色] =>黒 [価格] =>21000)
      [1] => Array([重量] =>150 [色] =>白 [価格] =>20000)
      [2] => Array([重量] =>150 [色] =>赤 [価格] =>23000)
    )
  )
 )
 
というように取得できました。

投稿日時 - 2014-01-27 18:13:00

あなたにオススメの質問