親子関係のテーブルを取得して多次元配列化する方法

このQ&Aのポイント
  • PHPとMySQLを使用して親子関係のテーブルを取得して多次元配列化する方法について質問があります。
  • MySQLで作成された3つのテーブルを連結し、親テーブルの結果 => 子テーブルの結果 => 孫テーブルの結果という形で多次元配列化したいです。
  • gr_statusが1の全データを取得し、PHPで入れ子にする方法やSQLでの取得方法があれば教えてください。
回答を見る
  • ベストアンサー

親子関係のテーブルを取得して多次元配列化するには

お世話になります。 基本的な質問かもしれませんが、教えて頂けますとうれしいです。 PHP Version 5.4.14 MySQL 5.5.27 の環境です。 MySQLでたとえば以下のようなテーブルを3種類用意したとします。 ●group gr_id | gr_name | gr_status 1 | 野菜 | 1 2 | 果物 | 1 3 | 穀物 | 0 ●product pr_id | pr_name | pr_gr_id | 1 | 大根 | 1 | 2 | キャベツ | 1 | 3 | にんじん | 1 | 4 | イチゴ | 2 | 5 | 米 | 3 | ●picture pc_id | pic_file | pc_pr_id | 1 | 1.jpg | 1 | 2 | 5.jpg | 1 | 3 | 10.jpg | 1 | 4 | 100.jpg | 2 | 5 | aiueo.jpg | 2 | 6 | kakikuk.jpg | 3 | 6 | xxxxxxx.jpg | 4 | 6 | zzzzzzz.jpg | 5 | 各テーブルは (親)group[gr_id] = (子)product[pr_gr_id] (子)product[pr_id] = (孫)picture[pc_pr_id] の項目で、親、子、孫の関係になっています。 このとき、gr_status = 1 に該当する全データを、 3つのテーブルを連結した上で取得し、 「親テーブルの結果 => 子テーブルの結果 => 孫テーブルの結果」 という形で多次元配列化したいのですがどのようにすれば出来そうでしょうか? SQLでそのように取得する方法があるか、それとも 一度全データを取得した後、PHPで入れ子にする方法があるのでしょうか。 よろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.1

SQLで取り出せるデータはエクセルの表のような2次元でしかありませんので、selectした結果から直に多次元配列を作ることはできません。 PHPで地道に配列に入れていくしかないでしょう。 groupテーブルのselect結果をループ処理で順番に取り出し、そのループの中でgr_idをキーにproductテーブルをselectした結果をループ処理で順番に取り出し、さらにそのループの中でpr_idをキーにpictureテーブルをselectした結果をループ処理で順番に配列に入れるといった感じでしょう。

doomdoom
質問者

お礼

ありがとうございます。 やはりPHP側で配列の処理をするしかないのですね。 頑張ってやってみたいと思います。 ありがとうございました。

関連するQ&A

  • 親子関係のテーブルについて

    現在SQLServerを使用した、Webアプリケーションの製作を行なっています。 そのデータベース内で、親子関係があるテーブルを使用しており、親テーブルの主キーIDを、子テーブルの外部キーに設定しています。 親テーブルの主キーIDはidentityを使用して連番にしています。 親子関係があるテーブルは、親が登録されると、すぐに子のテーブルにもデータを追加するという形で、親テーブルが追加された直後に親テーブルの主キーIDをMAX関数を使用して取得し、子テーブルに登録しております。 このやり方ですと、通常は問題は無いのですが、同時に連続してアクセスがある時に、親テーブルの主キーIDを取得する際に、ずれが生じたりして正確な親子関係にならない場合があります。 この手法は一般的な手法ではないのでしょうか?また、何かいい対処法はございませんでしょうか? お力をお貸しください。よろしくお願いします。

  • 親子関係があるテーブルでの抽出

    教えてください。 ASPでMDBを検索したいのですが、 SQLにどうかけばいいのか悩んでします。 テーブルAがあります。 ID、名前、住所、親IDというフィールドがあります。 実は親子関係がこのテーブルには含まれていまして、 子データには、親IDに親データのIDが入っています。 子データにも名前、住所が入っています。 親データの親IDには0が入っています。 このテーブルAの名前・住所・子データの名前・子データの住所で 文字検索したいのですがどのようなSQLになりますか? 子データは、ないものもあります。 以上よろしくおねがいします。

  • MySQLでの複数テーブル(4つ)への検索について

    はじめまして、こんばんは。 現在、ECサイトを構築中なのですが、MySQLにPHPから検索をかけたいのですが、どうにも詰まってしまったので、投稿させて頂きました。 PHPバージョン:PHP 5.2.6 DBバージョン:MySQL 4.1.22 機能としては、購入履歴から、購入商品のランキングを作りたいと思っております。 ランキング自体の表示はOKなのですが、そこに商品のカテゴリーを表示させたいのです。 関係するテーブルは以下の通りです。 【order】購入履歴テーブル product_id:商品ID 【products】商品テーブル product_id:商品ID name:商品名 image:商品画像 【p_category】商品カテゴリーテーブル product_id:商品ID category_id:カテゴリーID 【category】カテゴリーテーブル category_id:カテゴリーID category_name:カテゴリー名 parent_category_id:親カテゴリーID 【表示させたい項目】 product_id:商品ID name:商品名 image:商品画像 category_id:カテゴリーID category_name:カテゴリー名 parent_category_id:親カテゴリーID 現在のソースは以下の通りです。 --------------------------------------- SELECT   count(o.product_id) as rank,   name,   image,   p.product_id FROM   order as o,   products as p WHERE   o.product_id=p.product_id GROUP BY   name,   image,   p.product_id ORDER BY   rank desc limit 5 --------------------------------------- 上記にプラスしたいのは、 p.product_idと【p_category】のproduct_idが一致したcategory_idを取得して、【p_category】のcategory_idと【category】category_idが一致したcategory_name、parent_category_idも取得したいです。 分かりにくいうえに、長文になってしまいましたが、ご指導・ご鞭撻のほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 2つのテーブルでの合計取得

    環境:Mysql4.1.19 次のようなAテーブルとBテーブルのキーごとのレコードカウントを取得したいのですが、どのようなSQL文を作ればよいのでしょうか? Aテーブル ID Hiduke 005 2006-10-1 006 2006-10-3 001 2006-10-1 005 2006-10-6 005 2006-10-1 Bテーブル ID Hiduke 006 2006-11-1 006 2006-11-3 001 2006-11-1 003 2006-11-6 005 2006-11-1 から、次のような結果を得たい。 005 4 006 3 001 2 003 1 以上です。初心者ですが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 親子関係があるテーブル内での検索

    親のidを保持するテーブルです。 CREATE TABLE `tbl` ( `id` int PRIMARY KEY, `parent_id` int, FOREIGN KEY(`parent_id`) REFERENCES `tbl`(`id`) ) ENGINE=InnoDB; このテーブルで「parent_idがNULLで、かつ、子を持たない(親というか子でもないというか)行」 を検索したいのですが、どのようなSQLを記述すれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 複数テーブルからのデータ取得

    MySQLで 4つのテーブルからデータを取得する方法を教えてください。 4つのテーブルの構造は全く同じです。 構造的には id・・・int name・・・varcher(30) point・・・int start・・・datetime end・・・datetime tableA,tableB,tableC,tableDの4つのテーブルからpointのデータを昇順に取得したいです。 よろしくお願いします。

  • 2つのテーブルを結合する条件

    現在、MySQLを使用しており2つのテーブルの結合条件がわからないので教えてください。 name_masterとmeiboの2つのテーブルがあります。 meiboとname_masterを結合させてname_idとname_id2が日本語に置き換わった状態で 取得させたいと思っています。どのようにwhere句の条件を作成すればよいでしょうか。 取得する項目のイメージとしては以下の3つが取得できるようにしたいです。 「meibo.no, meibo.name_idの日本語, meibo.name_id2の日本語」 【name_masterテーブル】 id name 1  ポチ 2  タマ 3  ミケ 4  ハチ 5  タロウ 【meiboテーブル】 no  name_id  name_id2 1    3     1 2    4     2 3    5     3

    • ベストアンサー
    • MySQL
  • 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
  • 2次元配列の使い方

    Access 2013 vba メイン画面に、2つのサブフォーム(共に帳票)があり 親→子→孫 となっています。 この時、親、子、孫のレコードを取得して ある書類を作成しエクセルに出力しようとしています。 この場合、親のデータは普通に変数Aに入れて 子のデータは一次元配列B()に入れ 孫のデータは一次元配列C(0)~C(3)に入れたものを、更に子用の一次元配列B1()~B4()に入れるように作りにしようと考えています。 この場合、 子の画面で次の2レコード目に進んだ時、子画面用のB1...B4の配列変数に入れている孫のC(0)~C(3)の配列の中身は、子画面の一レコードと二レコード目では同じものになるのでしょうか。 もし、同じものになるのであれば、この方法は使えないと思っていますが。。。 他に何か良い方法はありますでしょうか。 Accessで、クラスを作って、それを配列変数に入れるとか・・・ よろしくお願いします。

  • 2つの関連するテーブルで指定した値を条件に取得したい

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ 「tbl1s」テーブルの行を「tbl2s」テーブルのnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「sato」を条件にした場合は、 テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  3  | +------+ を取得したいです。

    • ベストアンサー
    • MySQL