- 締切済み
一度に関連する他のテーブルの行も取得したい
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テーブルの行まで取得したい
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
#3です どうしたいのかよくわからないです。 hoge[0]["user_id"] → aaaa hoge[0]["items"][0]["user_id"] → bbbb という構造があるうるということですか? もちろん、そういうことであれば納得いくのですが。 もしhoge[0]["user_id"] が 常にhoge[0]["items"][0]["user_id"] と同じ値であれば、そんな冗長な構造は必要ないので hoge[0]["items"][0]["user_id"]が必要なときには hoge[0]["user_id"]を参照すればよいと言うことを いいたかった訳です。 データ構造の設計の問題なのでその辺が理解できていないと いくらプログラムをきちんと書こうとしても、いつまでも まっとうに組みあがらないと思います。
- yambejp
- ベストアンサー率51% (3827/7415)
そもそもitemsの中にuser_idが何故必要なのでしょうか? 親要素ですでにuser_idは指定されいますよね? データ構造から再検討なさってみてはいかがでしょうか それとSQL文からどうやって配列をつくっているかが 書いていないのでその辺の補足もいれた方が回答しやすい質問に なると思います
- shimix
- ベストアンサー率54% (865/1590)
>こうではなくて[items] => Arrayの中にitemsテーブルの行を格納して >取得したいのですが、どのように書けば良いのでしょうか? DBというものに対して誤解しているのでしょうかね。DBからSQLで取得できるのは、あくまでも「行単位」です。それ以降はプログラム側でどうするか・・という話になります。 (蛇足) プログラム側でも高次配列にしない方が扱いやすいと思うのですけどね。キーブレーク処理などは行単位基準で作りますし・・。
- shimix
- ベストアンサー率54% (865/1590)
テーブルを「結合」して取得するためのJOINという構文があります。 http://dev.mysql.com/doc/refman/4.1/ja/join.html http://dev.mysql.com/doc/refman/5.1/ja/join.html INNER JOIN と OUTER JOIN の違いなどは、こちらの例などを・・ http://f32.aaa.livedoor.jp/~azusa/index.php?t=mysql&p=join どっかにわかりやすい解説サイトがあったハズなんですが、失念してしまった(最近読んでない・・)。
お礼
ご返答ありがとうございます。 SELECT * FROM users INNER JOIN items ON users.user_id = items.user_id; というSQL文で試してみたのですが、 Array ( [0] => Array ( [user_id] => aaaa [item_name] => アイテム1 ) [1] => Array ( [user_id] => aaaa [item_name] => アイテム2 ) [2] => Array ( [user_id] => bbbb [item_name] => アイテム3 ) ) このような結果になってしまいます・・・ こうではなくて[items] => Arrayの中にitemsテーブルの行を格納して 取得したいのですが、どのように書けば良いのでしょうか? あともう一つ「items」と似た内容のテーブル「skills」を追加して Array ( [0] => Array ( [user_id] => aaaa [items] => Array ( [0] => Array ( [user_id] => aaaa [item_name] => アイテム1 ) [1] => Array ( [user_id] => aaaa [item_name] => アイテム2 ) ) [skills] => Array ( [0] => Array ( [user_id] => aaaa [skill_name] => 特技1 ) ) ) [1] => Array (上と同じような内容になります) ) のように取得したいのですが、こちらの方もできればやり方を 教えてもらえないでしょうか? テーブル「users」 +----------+ | user_id | +----------+ | aaaa | +----------+ | bbbb | +----------+ テーブル「items」 +----------+---------+ | user_id |item_name| +----------+---------+ | aaaa | アイテム1| +----------+---------+ | aaaa | アイテム2| +----------+---------+ | bbbb | アイテム3| +----------+---------+ テーブル「skills」 +----------+---------+ | user_id |skill_name| +----------+---------+ | aaaa | 特技1 | +----------+---------+ | bbbb | 特技2 | +----------+---------+ | bbbb | 特技3 | +----------+---------+
お礼
ご返答ありがとうございます。 >そもそもitemsの中にuser_idが何故必要なのでしょうか? itemsテーブルはそれぞれのユーザ(キャラクター)が持っている アイテム(可変)なので、これは1つのテーブルとして分けた方が良いと思うのですが、 そこで、どのユーザの所持品なのかというキーがitemsテーブルの中に含まれていないと、 その行が特定できなくないですか? 「users」テーブルはユーザ(キャラクター)の基本情報が入っていて、 アイテムなどを別テーブルで管理するやり方です。 テーブル「users」 +----------+---------+---------+ | user_id |user_name|その他のカラム +----------+---------+---------+ | aaaa | ユーザ1 |・・・ +----------+---------+---------+ | bbbb | ユーザ2 |・・・ +----------+---------+---------+ >それとSQL文からどうやって配列をつくっているかが書いていないので 省略してすいません。こういうことでしょうか? $users = SELECT * FROM users; $index = 0; foreach ($users as $row) { $users[$index]['items'] = SELECT * FROM items WHERE user_id = '{$row['user_id']}'; $index++; } //print_r($users); ビュー表示関数($users);//←表示関係にまるごと渡す たしかにこのやり方だと、shimixさんのおっしゃる通り扱い難くくて、 ここでitemsテーブルの行を取り出す分、無駄があるのかもしれないのですが、 MVC(制御関係と表示関係を分けた書き方)で書いた時にこの方がすっきりしそうなので こういうやり方にしてるのですが・・・どうなんでしょう