以下のような4つのテーブルがあったと仮定します。
person_tblが所属するカテゴリ(cat_tbl)だけをsqlで抽出したいのです。
テーブル名:person_tbl
pk per_id
フィールド名:per_id, per_name,
1, 山田
2, 田中
3, 佐藤
テーブル名:cat_tbl
pk cat_id
フィールド名:cat_id, cat_name
1, 九州
2, 関東
3, 近畿
4, 北陸
テーブル名:subcat_tbl
pk sub_id
フィールド名:sub_id, sub_name, cat_id
1, 沖縄, 1
2, 福岡, 1
3, 東京, 2
4, 千葉, 2
5, 京都, 3
6, 大阪, 3
7, 京都, 3
8, 福井, 4
person_tblとsubcat_tblのT字型テーブル
テーブル名:per_to_sub
pk per_id, sub_id
フィールド名:per_id, sub_id
1, 1
1, 2
2, 3
3, 4
3, 8
結果配列
1, 九州
2, 関東
4, 北陸
どのようなsqlを発行すればいいでしょうか?
少し複雑になると頭が混乱します。
そもそも、このような設計で希望の配列が抽出できますか?
よろしくお願いします。
こんな感じでしょうか。
SELECT * FROM cat_tbl WHERE cat_id IN ( SELECT cat_id FROM subcat_tbl WHERE sub_id IN ( SELECT sub_id FROM per_to_sub WHERE per_id IN ( SELECT per_id FROM person_tbl ) ) );
出身地方だけを抜き出す場合は下記です。
SELECT T1.per_id, T4.cat_name
↓
DISTINCT SELECT T4.cat_id, T4.cat_name
もしくは
DISTINCT SELECT T4.*
>その場合、困ったことになりませんかね。
単純に出身地方のように考えていたので1対1だと思い込んでいました。
1対nであれば都合3テーブルになるのは致し方ないかもしれません。
非正規化になりますが1対nのnの最大数を決定できる場合は
person_tbl : per_id, per_name, sub_id1, sub_id2, sub_id3
などという手も無きにしも非ずですが、これはケースバイケースなので
とりあえずは3テーブルが妥当かな。
また、丁寧な回答をありがとうございます。
例えが紛らわしいですね。
次回から気をつけます。
nの最大数は未定なので3テーブルで行きます。
頑張っているのですが、表結合はなかなか上達しません。
皆さん含む kn1967 さんがいろんな回答を示してくれるので非常に勉強になります。
参考に頂いたリファレンスをじっくり読んでみます。
ありがとうございました。