• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:親と子供が複数のSQL取得方法)

親と子供が複数のSQL取得方法

このQ&Aのポイント
  • 親に対して複数の子供がいるようなデータ構造の場合、一つのSQLで取得する方法がわかりません。
  • 楽天のようなモールサイトでの商品検索の例を考えます。
  • 取得したい結果は、各店舗の商品一覧であり、各商品には店舗支払い方法が含まれます。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

パッと思いつくのは下記の2つですかね。 1. 全部のテーブルを単純に店舗番号で結合し、ホスト言語(PHP)側で連想配列などを使用して、同一店舗・同一商品ごとのデータにまとめる。 例) ---------------------------------------------- SELECT tp.店舗番号, sh.商品番号, sr.支払方法コード FROM 店舗 tp JOIN 商品 sh ON (tp.店舗番号 = sh.店舗番号) LEFT OUTER JOIN 店舗支払方法 sr ON (tp.店舗番号 = sr.店舗番号) ORDER BY 店舗番号, 商品番号, 支払方法コード; -------------------------------------------------- 2. 支払方法を GROUP_CONCAT を使って連結して取り出し、ホスト言語(PHP)側でその文字列を分割する。 例) ---------------------------------------------- SELECT tp.店舗番号, sh.商品番号, sm.支払方法 FROM 店舗 tp join 商品 sh on (tp.店舗番号 = sh.店舗番号) join (SELECT 店舗番号, GROUP_CONCAT(sr.支払方法コード) AS 支払方法 FROM 店舗支払方法 sr GROUP BY 店舗番号) sm ON (tp.店舗番号 = sm.店舗番号) ORDER BY 店舗番号, 商品番号; -------------------------------------------------- ちなみに GROUP_CONCAT の区切り文字は SEPARATOR オプションを使って指定できます。 GROUP_CONCAT(sr.支払方法コード SEPARATOR "\t") -- タブ区切りの場合

sirabetai
質問者

お礼

ありがとうございます。 抽出することが出来ました! 支払い方法はプログラムの方で分割してみます。 助かりました!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

こんな構成でどうでしょう? データ作成: create table shop(id int not null primary key ,shop_name varchar(30)); insert into shop values(1,'店舗A'),(2,'店舗B'),(3,'店舗C'); create table item(id int not null primary key ,item_name varchar(30)); insert into item values(1,'商品1'),(2,'商品2'); create table payment(id int not null primary key,pay_name varchar(30)); insert into payment values(1,'代引き'),(2,'クレジット'),(3,'銀行振込み'); create table shop_item_payment(id int not null auto_increment primary key,shop_id int not null,item_id int not null,payment_id int not null , unique (shop_id,item_id,payment_id)); insert into shop_item_payment(shop_id,item_id,payment_id) values(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,2),(1,2,3),(2,1,1),(2,1,2),(2,2,1),(2,2,2),(3,1,2),(3,2,2); 抽出: select shop_name,item_name,group_concat(pay_name order by p.id) from shop_item_payment inner join shop as s on s.id=shop_id inner join item as i on i.id=item_id inner join payment as p on p.id=payment_id group by shop_id,item_id;

sirabetai
質問者

お礼

データまで用意して頂いてありがとうございます。 商品テーブルのキーが一つ足りないのでちょっとテーブル構成が違うのですが、このような作り方もあるのだと勉強になりました。 ありがとうございます。

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

店舗番号を渡すと支払い方法の一覧を返すストアドファンクションを作成する。

関連するQ&A