- ベストアンサー
3つのテーブルからのデータ抽出
こんばんは。 久しぶりの投函ですが、以下の内容を処理することが出来ずに悩んでおります。 テーブルを結合して・・というのは、分かるのですが、ネットで検索してもその殆どが2つのテーブルに関するものなので、その設定が出来ずに時間を費やしている状況です。 お忙しい中恐縮ですが、アドバイスなど頂戴できたら幸いです。 table:main id name 1 たかし 2 しげる 3 あけみ 4 ひろみ 以下のtableのid、p_idは、mainTBのidを指しています。 table:frend no id p_id 1 2 3 2 4 1 3 1 2 4 2 4 5 3 1 以下のtableのidは、mainTBのidを指しています。 table:comment no id naiyou 1 3 よろしく 2 4 こんにちは 3 2 おめでとう 4 3 楽しい 以上のテーブルが存在し、mainのid、しげるを検索した際、 frendTBに参照し、しげる(id=2)に該当するp_id(この場合、3、4)を探し、且つcommentTBにあるidである、naiyouを表示したいと考えてます。 実際の表示はこんな感じ・・ しげる(id=2)を検索した場合、 よろしく あけみ こんにちは ひろみ 楽しい あけみ 以上、アドバイスだけでも結構です。ご指導のほど宜しくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
普通にやるならこうですね select c.naiyou,m2.name from main as m inner join friend as f on m.id=f.id and m.name='しげる' inner join comment as c on f.p_id=c.id inner join main as m2 on m2.id=c.id 表示順については特に指定がないので考慮していません
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
質問内容が、かなり分かりにくいです。 frend表のidは、「もらった側のmain.id」、p_idは「送った側のmain.id」、comment表のidは、「送った側のmain.id」ということを他人が理解するには、この質問内容では時間が掛かってしまいます。 過去にもMySQLの質問をしていたらしいですが、それならばMySQLのバージョンにより、実装されている機能に大きな違いがあることをご存知ではないでしょうか? バージョンを明記してもらわないと、せっかく具体的なSQLを提示しても、質問者さんの環境では実行できないかも知れません。 分かりやすい説明が難しいなら、質問者さんが考えたSQLを提示したり、さらに良いのは定義やテストデータ格納のSQLをここに貼り付けてもらえれば、アドバイスする側として助かります。 例えば、以下のアドバイスのような形で、情報を予め貼り付けておいてもらえれば、アドバイスする側としても効率的に回答できます。 1.表定義&テストデータ格納 create table `main` (id int primary key, name varchar(10)); insert into `main` values (1,'たかし'), (2,'しげる'), (3,'あけみ'), (4,'ひろみ'); create table `friend` (no int primary key, id int, -- もらった側のmain.id p_id int, -- 送った側のmain.id index(id), index(p_id)); insert into `friend` values (1,2,3), (2,4,1), (3,1,2), (4,2,4), (5,3,1); create table `comment` (no int primary key, id int, -- 送った側のmain.id naiyou varchar(10), index(id)); insert into `comment` values (1,3,'よろしく'), (2,4,'こんにちは'), (3,2,'おめでとう'), (4,3,'楽しい'); 2.検索 select -- * cm.naiyou, m.name from ( select p_id from `friend` as f1 where f1.id in(select id from `main` where name='しげる') ) as x, `main` as m, `comment` as cm where m.id=x.p_id and cm.id=x.p_id ; 3.備考 MySQLのバージョンが不明ですが、2のSQLでは、インラインビュー、サブクエリを使っています。これらは、MySQL 4.1で実装されたと記憶しています。 それより古いバージョンなら、一時表(create temporary tableで定義)を使うといった工夫が必要になります。
お礼
chukenkenkou様 こんばんは。 詳しい内容のアドバイスを有難う御座います。 今回の投函により、望んでいた結果を得ることが出来ました。 スキルが乏しく、適切な質問文でなかったことをお許し下さい。次回以降、気をつけたく思います。 (バージョンなどは投函後に記載のし忘れに気付きました・・。) 有難う御座いました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
骨子のみ。 表が3つと見えますすがこの問題では表を4つとして扱う必要が有ります。 上からA,B,Cと名付けましょう。 A表は2回使われますので2つの表にします。 A1とA2とリネームしましょう。 使われる順番はA1→B→C→A2です。 そこでセレクト分は表名宣言4つ、WHERE分は等式が3つです。 A1.XX=B.XX AND B.XX=C.XX AND C.XX AND A2.XX あとはお考えください。
お礼
ymmasayan様 はじめまして、こんばんは。投函後、早速の書き込みを有難う御座います。 お蔭様で望んでいた結果を得ることが出来ました。 考え方など、理解しやすい手順を追っての説明を有難う御座いました。
お礼
yambejp様 ご無沙汰しております。数ヶ月も前になりますが、何度かお世話になっておりました。 スキルの乏しい私ですが、皆さまのアドバイスを踏まえ、yambejp様のソースを基に望んでいた結果を得ることが出来ました。 有難う御座いました。
補足
>アドバイスを頂戴した皆さまへ 補足欄から失礼します。 ありがたいアドバイスにより、望んでいた結果を得ることが出来ました。 今回、3名の方からアドバイスをいただき、2名に絞ってポイントを寄与することに恐縮してしまいますが、どれもありがたいアドバイスであったことをお伝えできればと思います。 この度は有難う御座いました。