• 締切済み

内部結合の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毎に取得できればと思っています。 どうぞよろしくお願い致します。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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);

fantrax
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

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

fantrax
質問者

お礼

ありがとうございます。 そうですね、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)     )   )  )   というように取得できました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • 2次元配列の作り方

    データ型 name varchar(30), item1 char(8), item2 int(6) として下記のテーブルがあります。 | name | item1 | item2 | | taro | abcd | 28 | | taro | efghk | 33| | taro | lmnp | 05 | これから2次元配列形式でデータを取得したいのですが、うまく並んでくれません。 まず、 (前略) $query ="SELECT item1,item2 from *** where name='taro'"; $result = mysql_query($query,$conn_id) or die($query.'failed('.mysql_error().')'); $data[][] = mysql_fetch_assoc($result);  とすると(当然ながら)、 Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] =>28 ) ) ) と最初のレコードだけが取得されます。 while($data[][] = mysql_fetch_assoc($result)){ print_r($data); echo "<br/>\n"; } とすると、 Array ( [0] => Array ( [0] => Array ( [item1] =>abcd [item2] => 28 ) ) ) Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) ) [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) ) ) Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) )      [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) )      [2] => Array ( [0] => Array ( [item1] => lmnp [item2] => 05 ) ) ) となってしまうのですが、 Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) )      [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) )      [2] => Array ( [0] => Array ( [item1] => lmnp [item2] => 05 ) ) ) だけを取得させるにはどのように書けば良いでしょうか?

    • ベストアンサー
    • PHP
  • アクセス・クエリでのテキスト累計

    お世話になります。アクセス初心者です。 QNo.3023548 「アクセス 同じフィールド(テキスト型)のレコードを連結させたい」 の方と同じ質問内容で申し訳ありません。 私のレベルでは、うまく理解することが出来ませんでした。 あらためまして マイクロソフト アクセス 2000を使用しております。 【テーブル1】 ID 商品コード 金額  色 1______100__________\10______赤 2______100__________\10______青 3______200__________\10______黄 4______200__________\10______緑 5______200__________\10______黒 【クエリ1】 ID 商品コード 金額  色  累計金額  色の累計 1______100__________\10______赤__________\10____________赤 2______100__________\10______青__________\20____________赤-青 3______200__________\10______黄__________\10____________黄 4______200__________\10______緑__________\20____________黄-緑 5______200__________\10______黒__________\30____________黄-緑-黒 累計金額は式ビルダで 累計金額: (Select SUM(金額) From テーブル1 As 累計 Where テーブル1.ID >= 累計.ID And テーブル1.商品コード = 累計.商品コード) なんとか作る事が出来ました。 色の累計を、この式を使って試みましたが うまくいきません。 できれば、式ビルダ形式で回答を頂くとありがたいです。 よろしくお願い致します。

  • PHP5でxml文書をパースする方法

    <?xml version="1.0"?> <root> <items>  <item>   <id>1</id>   <name>商品(赤)</name>   <price>1500</price>   <color>red</color>   <size>8</size>   <option>A</option>  </item>  <item>   <id>2</id>   <name>商品(青)</name>   <price>700</price>   <color>blue</color>   <size>3</size>  </item>  <item>   <id>3</id>   <name>商品(緑)</name>   <price>1200</price>   <color>green</color>   <size>5</size>   <option>C</option>  </item> </items> </root> 上記のようなXMLデータをPHPでパースし、 1つずつ、配列に入れていきたいと考えていますが、 問題なのは、 上から2番目の商品(青)には、<option>データが無いということです。 これは、この<option>が、オプションが有る時にだけ存在するタグだからです。 //----------------------------- <?php $doc->load($url); //上記xmlデータのあるURL:$url $array = array(); $i = 1; while($i <= 3){  //実際には、もっと商品数はあります。ここでは例として、3。  //配列の初期化  $item_array = array();  $items = $doc->getElementsByTagName('id');  $item_array['id'] = $items->item($i)->nodeValue;  $items = $doc->getElementsByTagName('name');  $item_array['name'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  $items = $doc->getElementsByTagName('option');  $item_array['option'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  //商品データが詰まった配列を、さらに配列に入れる  $array[] = $item_array; } //全ての商品のデータが詰まった配列を表示する。 print_r($array); ?> //----------------------------- このようなことがしたいわけです。 なお、タグ名を$tag_array = array('id','name',,,,,'option',,,)として、 foreach($tag_array as $tag){  $items = $doc->getElementsByTagName($tag);  $item_array[$tag] = $items->item($i)->nodeValue; } という風にした方が冗長ではないかとは思いますが、 それは、まぁ横に置いておきまして、 このコードで問題なのは、<option>が途中、つまり2番目で抜けると、 3番目の<option>データが、2番目の商品の<option>データとして配列に入ってしまうことです。 上から順に詰めて、配列に格納されてしまい、困っている、ということです。 <option>データが無い場合は、「ナシ」とでもしておきたいのですが、 どうしたら良いでしょうか? <item>を1つずつ   $items = $doc->getElementsByTagName('item'); で取得して、 各<item>の中の、<option>にアクセスする、なんて方法があるとベストなのですが、 そんな方法はありますでしょうか? firstChildですと、<item>の場合、<id>になってしまうため、<option>にはアクセスできません。 firstChild以降のChildには、どうやってアクセスしたら良いのでしょうね? どなたか、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SELECT文で重複せずに取得するには?

    SELECT文で質問があります。 商品情報を格納したテーブルを作成し、「商品名を検索するとその商品番号を取得する」という単純なSELECTですがうまくいきません。 ■tb_items → 商品情報を格納しています。 -------------------------------------------- 商品番号 サイズ 重さ 001   50   120 002   30   200 -------------------------------------------- ■tb_details → 店舗毎の情報を格納しています。 -------------------------------------------- 商品番号 店舗番号 商品名       価格 001   shop_A  シャープデジカメ  50000 001   shop_B  シャープcamera   56000 002   shop_A  パナソニックスマホ 85000 002   shop_B  Panasonicスマホ   79000 -------------------------------------------- ここで、「商品名を検索するとその商品番号を取得できる」としたいのですが、例えば「シャープ」で検索すると商品番号001を取得できますが、「sharp」で検索すると当然ですが商品番号001は取得できません。 そこでタグのようなものを登録するテーブルをさらに作成しました。 ■tb_tags -------------------------------------------- タグ     商品番号 sharp     001 カメラ     001 スマートフォン 002 携帯      002 -------------------------------------------- 試しに「sharp カメラ」を検索してみました。SELECT文は以下のようにしました。 -------------------------------------------- SELECT  tbI.`商品番号` FROM  tb_items AS tbI LEFT JOIN  tb_details AS tbD ON tbI.`商品番号` = tbD.`商品番号` LEFT JOIN  tb_keywords AS tbK ON tbI.`商品番号` = tbK.`商品番号` WHERE  (   ((tbK.`タグ` = 'sharp') OR (tbK.`タグ` = 'カメラ')) OR   (    (tbD.`商品名` LIKE '%sharp%') AND (tbD.`商品名` LIKE '%カメラ%')   )  ) -------------------------------------------- 取得した結果は、 001 001 というように同じ商品番号を重複して2つ取得してしまいます。 検索を「シャープ camera」にしても重複して2つ取得してしまいます。 やりたいことは、「検索文字列(空白区切りあり)で商品名とタグを検索してヒットした商品番号を重複なしに取得したい」です。 どのようなSELECT文にすれば良いのでしょうか? お手数ですがアドバイスを頂けたらと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • グループ化したテーブルと他のテーブルの結合について

    お世話になります。PHP+MySQLでシステムを作っています。 商品のカテゴリーのテーブル・・・hametome_category(主キー:category_id ) 商品のテーブル・・・hametome_item(主キー:item_id ) 注文のテーブル・・・hametome_order(主キー:order_id ) 上記の3つのテーブルがあります。各テーブルにはそれぞれ、下記のようなデータを格納していて()内のカラムが含まれています。 hametome_category・・・カテゴリー名(category_id) hametome_item・・・商品名、単価など(category_id、item_id) hametome_order・・・注文内容等(category_id、item_id) この3つのテーブルを使い、カテゴリーごとの商品の一覧表を作り、一覧表の中に商品ごとの注文数量の累計を表示させたいと思っています。 【作りたい表のイメージ図】     単価 在庫数 注文数累計 商品A  100 1500 11000 商品B  120 1000 13000 商品C  130 1700 18000  ・  ・  ・ 表がずれていたらスイマセン^^; SELECT文を使ってデータを抽出するのですが、この際、 $sql="select * from hametome_category c,hametome_item i where i.category_id = $id and c.category_id = i.category_id ORDER BY item_id"; このようにすると任意のカテゴリーに属する商品の一覧表を出力する事は出来るのですが($idは前ページからPOSTされてきます。)、これに注文内容のデータ抽出を組み合わせようとするとうまくいきません。 この表に注文内容(hametome_orderに登録されているデータ)をitem_idでグループ化し合計したものを表示させたいです。 $sql="select *,SUM(order_amount) AS goukei from hametome_order GROUP BY item_id"; とすれば、注文数の累計をitem_idで合計しグループ化する事は出来るのですが(『order_amount』はhametome_orderテーブルに登録されている注文数です。)、この内容を最初のSELECT文にうまく組み込む事が出来ません。 どのようにすれば思うような結果を得られるでしょうか?ご教授のほどよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • テーブルの結合について

    皆さん教えてください。 zaiko と testBと言うテーブルに商品IDカラムを入れておき この二つのテーブルを結合して商品データはあるけど 在庫がない物だけを抽出したいのですが、その場合どのような SQLになるでしょうか?? 商品データも在庫もある場合下記のSQLで商品情報と在庫データが 出てくるのですが、その逆と言うか、商品情報は登録してあるが、 在庫テーブルに登録されていない商品情報を検索したいと思っております。 select zaiko.*,product_data.* from zaiko inner join product_data on zaiko.nyuko_item_code = product.item_code ではどうかよろしくお願いします。

  • アクセスについての質問です。

    不一致クエリについての質問です。 テーブル1     テーブル2 商品   色    商品   色 えんぴつ 赤    えんぴつ 青 えんぴつ 青    えんぴつ 青 けしごむ 青    けしごむ 赤 えんぴつの色が赤のものを検出する方法はありますか? 二つのフィールドを比較出来るのでしょうか? プログラムを作成しないとダメでしょうか? プログラムを作成するならVBAのコードを教えてほしいです。 よろしくお願い致します。

  • 商品番号ごとのバリエーションを1つのセルに結合する

    A列に異なる商品番号、B列にバリエーション(色名)が書かれた列があったとします。 同じ商品番号に複数のバリエーションが割り振られていて、それぞれを白、黒だとしたら白/黒のように結合したいのですが、関数でどのようにすればよろしいのでしょうか?仮ののデータをいかに記述いたします。 001| ブラック 001| ホワイト 002 | 赤 002 | 黄色 002 | ダークブラウン 002 | ブラック 002 | ベージュ 002 |  スイートピンク . . . 002 |  パープル 実際の色とは違いますが、 実際のファイルの同じ商品番号によっては20種類のバリエーションがあるものもございます。 csvで登録する際に同じ番号001のカラー同士をブラック/ホワイトのように1つのセルにまとめる必要があるのですが、上記にあげた例のように一つの番号で20種類のバリエーションがあるのでその場合についてもどうしたらいいかアドバイスをお願いいたします。

  • PHPでMySQLのデータを2次元配列に格納する

    PHPの本に $r = mysql_query("SELECT * FROM tb;"); while ($row = mysql_fetch_array($r)){ print "{$row['id']}{$row['title']}<BR>"; } とあったのですが1行ずつしか保存できないので 2次元配列row[][]で while ($row[] = mysql_fetch_array($r)){ } foreach($row as $v){ print "{$v['id']}{$v['title']}<BR>"; } このようにコーディングしたところ 一応うまく表示されたのですが、問題はないですか? もし普通はこういう風にするみたいなやり方があれば 教えて欲しいです。

    • ベストアンサー
    • PHP