人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLでSQL文の書き方について相談です。テーブル構成は以下のようになります。

■メンバーテーブル(members)
カラム:id,name
レコード:1,山田
2,佐藤
■グループテーブル(groups)
カラム:id,name,parent_id
レコード:1,スポーツ,0
2,野球,1
3,パソコン,0
■メンバーとグループのリレーション(member_groups)
カラム:id,members_id,groups_id
レコード:1,1,2

こういうテーブル構成・登録レコードになっているとします。
上記はリレーション構成で、「メンバーが複数グループに所属できる」設計になります。

そこで質問ですが、
・メンバー一覧から、グループを「野球」で検索したら、メンバーの「山田」が表示される。
・メンバー一覧から、グループを「スポーツ」で検索したら、メンバーの「山田」が表示される。

としたいのですが、グループ内が親子関係になっているので、どういうSQL文を書けばいいかわかりません。

ご存知のかたは、SQL文のアドバイスをお願いします。


●質問者: k27w
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● パパトモ
●200ポイント

member_groupsテーブルを中間に置いてJOINすればできると思います。
↓こんな感じです。

SELECT * FROM members INNER JOIN (member_groups INNER JOIN groups ON members.id = member_groups.menbers_id) ON member_groups.groups_id = groups.id WHERE groups.name = '野球'

SELECT * FROM members INNER JOIN (member_groups INNER JOIN groups ON members.id = member_groups.menbers_id) ON member_groups.groups_id = groups.id WHERE groups.name = 'スポーツ'

この場合、member_groupsテーブルのレコードは・・・
1,1,2
2,1,1

のレコードが必要になります。


パパトモさんのコメント
ポイントは、groupsテーブルの入れ子構造に捕われず、member_groupsテーブルにリレーと関係を表現すれば、シンプルになるということです。

パパトモさんのコメント
つまり、スポーツ>野球 とgroupsの構造を結果に盛り込みたいということですか?

k27wさんのコメント
はい。要件を書くと、 ・メンバーは複数のグループに所属できる ・出力時はツリー式(もしくは、スポーツ>野球 のような形)にしたい のですが、質問した構成で複数グループに登録はできるものの、出力時・検索時は迷います。 検索は、パパトモさんの方法でもできますが、出力時はどっちが親でどっちが子のグループかわからないです。

k27wさんのコメント
すみません、自分でもこの構成はよく理解できていないため、もう少し考えます。回答ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ