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文のアドバイスをお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/07/24 13:35:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:papa-tomo No.1

回答回数362ベストアンサー獲得回数107

ポイント200pt

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

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

他2件のコメントを見る
id:k27w

はい。要件を書くと、

・メンバーは複数のグループに所属できる
・出力時はツリー式(もしくは、スポーツ>野球 のような形)にしたい

のですが、質問した構成で複数グループに登録はできるものの、出力時・検索時は迷います。

検索は、パパトモさんの方法でもできますが、出力時はどっちが親でどっちが子のグループかわからないです。

2013/07/17 16:55:45
id:k27w

すみません、自分でもこの構成はよく理解できていないため、もう少し考えます。回答ありがとうございます。

2013/07/17 16:56:59
  • id:taknt
    グループテーブルに グループ名と そのメンバーを入れてるから わかりにくくなってるんだと思うよ。

    グループ名テーブル
    グループメンバーテーブルと 二つに 分けたほうが いいんじゃない?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません