- ベストアンサー
3つのテーブルから、データが重複しないように抽出したい
お世話になっております。 今回、以下のような3つのテーブルから情報を引き出したいのですが、 うまくいかず困っております。 【TABLE_A】 a_no | animal_name | ------+------------+ 0001 | uma | 0002 | usagi | 0003 | kirin | 【TABLE_B】 b_no | fish_name | ------+----------+ 000A | ayu | 000B | suzuki | 000C | kurodai | 【TABLE_C】 NO | a_no1 | a_no2 | b_no1 | b_no2 | ----+-------+-------+-------+-------+ 1 | 0001 | 0003 | null | 000A | 2 | 0002 | null | 000C | 000B | 3 | 0001 | 0002 | null | null | TABLE_Cをベースに、A、Bのテーブルから該当データのname値を取ってきたいのですがうまくいきません。 私が求める結果は以下のような感じです。(条件:WHERE NO = 1) NO | a_no | animal_name | b_no | fish_name | -----+------+------------+------+----------+ 1 | 0001 | uma | null | null | 1 | 0003 | kirin | 000A | ayu | 下記のように、INNER JOIN句を使ったりして四苦八苦してみたのですが、いまいち上手く抽出できません。 SELECT c.NO, a.a_no, a.animal_name, b.b_no, b.fish_name FROM (TABLE_C c INNER JOIN TABLE_A a ON c.a_no1 = a.a_no OR c.a_no2 = a.a_no ) INNER JOIN TABLE_B b ON c.b_no1 = b.b_no OR c.b_no2 = b.b_no WHERE c.NO = 1; 上記だと、 NO | a_no | animal_name | b_no | fish_name | ----+-------+------------+------+----------+ 1 | 0001 | uma | null | null | 1 | 0003 | kirin | 000A | ayu | 1 | 0003 | kirin | 000A | ayu | のように、余計に重複して結果が返されてきてしまいます。(3行目は2行目と同じ結果なのでいらないのです・・・) 何か良い構文はありませんでしょうか?;; 宜しくお願い致します! (環境は、MySQL 4.1.1です。)
- みんなの回答 (4)
- 専門家の回答
お礼
回答ありがとうございます! UNION句がありましたね・・・ 下記のような感じで実現できました! SELECT C.NO,A.a_no,A.animal_name,B.b_no,B.fish_name FROM (TABLE_C C INNER JOIN TABLE_A A ON C.a_no1=A.a_no) INNER JOIN TABLE_B B ON c.b_no1=B.b_no WHERE C.NO = 1 UNION SELECT C.NO,A.a_no,A.animal_name,B.b_no,B.fish_name FROM (TABLE_C C INNER JOIN TABLE_A A ON C.a_no2=A.a_no) INNER JOIN TABLE_B B ON C.b_no2=B.b_no WHERE C.NO = 1 なぜかleft joinを使うと、NO以外すべてnullという不思議な列が出てきてしまったので、inner joinを使いました(@_@) 追加質問なのですが、 今回のように、union句でselect文を繋げて一回のSQLでデータを取得する方法と、 php側で(LAMP環境です)TABLE_AとTABLE_Cを比較、その後TABLE_AとTABLE_Cを比較、というように2度SQLを投げるのと どちらがパフォーマンス的には良いのでしょうか? 実は、実環境では、 a_no1, a_no2, a_no3......a_no8 b_no1, b_no2, b_no3......b_no8 のように、8個ずつ値を取らなければならず、 UNIONで繋げようとした場合、すごく長いSQL構文になりそうで・・・。 また、何か他に良い方法等ございましたらご教授下さい。 よろしくお願い致します!