2つのテーブルのデータを2度使用して表示する方法について

このQ&Aのポイント
  • 使用するテーブルの構成とデータ、表示したい結果の例を紹介します。
  • 2つのテーブルのデータを結合して表示するためのSELECT文の例を紹介します。
  • 結合条件を適切に設定することで、表示したい結果を得ることができます。
回答を見る
  • ベストアンサー

SELCTを使って違うテーブルのデータを2度使って表示させたいのですが

SELCTを使って違うテーブルのデータを2度使って表示させたいのですが どのようにしたらいいのか教えてください。 ---------------------- ■テーブルの構成 ・FoodList NO(主キー) Food ・MyList NO(主キー) fist second ---------------------- ■テーブルの内容 ・FoodList NO Food 1 りんご 2 みかん 3 ぶどう ・MyList NO fist second 1 2 3 2 1 2 3 2 1 ---------------------- これで 1 みかん ぶどう 2 りんご みかん 3 みかん りんご というように表示させたいのですが どのようにしたらいいのでしょうか? --------------------------------------------------------- SELECT MyLike.NO AS Expr1,FoodList.food,MyLike.Second FROM FoodList INNER JOIN MyLike ON FoodList.NO = MyLike.first --------------------------------------------------------- とすると 1 みかん 3 2 りんご 2 3 みかん 1 となってしまいますし --------------------------------------------------------- SELECT MyLike.NO AS Expr1,FoodList.food,MyLike.Second FROM FoodList INNER JOIN MyLike ON FoodList.NO = MyLike.first AND FoodList.NO=MyLike.Second --------------------------------------------------------- とすると表示されないですし どのようにしたら実現できるでしょうか? 教えてください。よろしくお願いします。

  • epiko
  • お礼率58% (21/36)

質問者が選んだベストアンサー

  • ベストアンサー
  • vivas
  • ベストアンサー率100% (1/1)
回答No.4

誤字がかなり多いので一旦整理しますね ---テーブル情報--- ・FoodList NO Food 1 りんご 2 みかん 3 ぶどう ・MyList NO first second 1 2 3 2 1 2 3 2 1 --------------- 正しくは以下の通りです。 -------------------------------- SELECT MyList.No, FoodList.Food As firstFood, FoodList_2.Food As secondFood FROM MyList INNER JOIN FoodList ON MyList.first = FoodList.No INNER JOIN FoodList As FoodList_2 ON MyList.second = FoodList_2.No -------------------------------- スレ主の2件目クエリーの結合順序が逆になっているのが原因ですね。

epiko
質問者

お礼

回答いただきありがとうございます。 問題解決することができました。 ありがとうございます。

その他の回答 (3)

回答No.3

こんにちは。下手な説明になりますが、回答させていただきます。 なぜ、 --------------------------------------------------------- SELECTMyLike.NO AS Expr1,FoodList.food,MyLike.Second FROMFoodList INNER JOIN MyLike ON FoodList.NO = MyLike.first --------------------------------------------------------- ↑これで、結果が 1みかん3 2りんご2 3みかん1 になってしまうかと言うと、SELECTで最後に「Second」を入れている からです。これでは、JOINしても表示は数字になってしまいます。 正しく表示したいのであれば、 --------------------------------------------------------- SELECT MyList.NO AS Expr1,FoodList.food,FoodList.food AS FOOD_NAME FROM FoodList INNER JOIN MyList ON FoodList.NO = MyList.first OR FoodList.NO = MyList.second --------------------------------------------------------- ↑のように、同じ行のSELECTをしても「FOOD_NAME」のように別名をつけていれば 問題ありません。 また、ANDで結合条件をまとめるのではなく、ORにすれば表示されなくなることも なくなるはずです。 ※冒頭SQL文に出てくる、テーブル名「MyLike」とは「MyList」のミスだと解釈し て説明しています。 これでもし、うまく実行出来なかったらかなりお恥ずかしいです;すみません。 結果のお返事、お待ちしております。

epiko
質問者

お礼

丁寧に解説をいただきありがとう ございます。 今回なぜできなかったのかよく理解できました。 ありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

#1ですが、やはり訂正あり。 2行目のinnerJoinは、firstでは無くてsecondでした。 SELECT MyLike.NO AS Expr1, FL1.food, FL2.food FROM MyLike INNER JOIN FoodList FL1 ON MyLike.first = FL1.NO INNER JOIN FoodList FL2 ON MyLike.second = FL2.NO

epiko
質問者

お礼

回答ありがとうございます。 ログインできる環境ではなく今朝みさせていただき お礼がおくれてしまいました。 おかげでできることができました。 ありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

2回登場する[FoodList]にエイリアスを付けて、「別なテーブル」として識別させる。 SELECT MyLike.NO AS Expr1, FL1.food, FL2.food FROM MyLike INNER JOIN FoodList FL1 ON MyLike.first = FL1.NO INNER JOIN FoodList FL2 ON MyLike.first = FL2.NO 試験してないので、ちょっと怪しいかも。

関連するQ&A

  • whereの使い方が分からないのですが…

    foodテーブルの全ての項目内から「りんご」「みかん」というのキーワードをAND検索させたいのですが、 select * from food where ("りんご" AND "みかん"); select * from food where * "りんご" AND "みかん"; select * from food where *="りんご" AND *="みかん"; select * from food where *=("りんご" AND "みかん"); 思いつく限り試しましたが、どれもうまく行きません。 select * from food where (a="りんご" AND a="みかん") or (b="りんご" AND b="みかん") or (c="りんご" AND c="みかん") or… と、延々と続いて書くしかないのでしょうか? 何か方法はありますか?

    • ベストアンサー
    • MySQL
  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • SQLserverのテーブル値関数の使い方

    SQLserver2012でテーブル値関数を作成しています。 その際、実際の値ではなく、テーブルの列名を渡し、外部結合をしたいのですが、 上手くいきません。列名が指定できないのでしょうか。 教えてください。 --テーブル値関数 CREATE FUNCTION Func1 ( @User_name_no NVARCHAR(6), @String NVARCHAR(4000), @Flg NCHAR(1) ) RETURNS TABLE AS RETURN (   処理 ) select * from func1('000001','aaaaaaaaaaaa','1'); 問題なく処理が行われます。 が 以下の様にテーブルの列名を指定し外部結合すると上手くいきません。 select B.* from USER_INFO_TBL A inner join func1(A.user_no,T1.user_data,T1.flg) B on A.user_no=B.User_no_no; とか select B.* from USER_INFO_TBL A inner join (select * from func1(A.user_no,T1.user_data,T1.flg)) B on A.user_no=B.User_no_no; メッセージ 4104、レベル 16、状態 1、行 4 マルチパート識別子 "A.user_no" をバインドできませんでした。 メッセージ 4104、レベル 16、状態 1、行 4 マルチパート識別子 "A.user_data" をバインドできませんでした。 となります。 どうすればよいか教えてください。お願いします。

  • 複数のテーブルの全てのカラムを一度に検索するには?

    検索対象のカラムがid(主キー)、bc1~bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。

    • ベストアンサー
    • MySQL
  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • テーブル結合について

    SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • MySQLテーブルの結合

    MySQLテーブルの結合 select フィール名(field1,field2,field3)from xテーブル名 [inner/left/right] join yテーブル名 on 結合条件 解説書には説明されています 現在自分のデータベースは ahogedb(テーブル名) no hoge1 hoge2 bhogedb(テーブル名) no ahogeno(ahogedbのnoを登録) hoge3 ahogedbを表示してbhogedbでの訪問回数を表示させたいのです bhogedbのahogenoにはahogedbのnoが逐次登録されています 表示はno,hoge1,hoge2に追加したahogenoのカウント数 select文の式の書き方を出来れば1列にして教えてください ahogenoは別名の変数処理するのでしょうか

    • ベストアンサー
    • MySQL
  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

  • 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です。)

    • ベストアンサー
    • MySQL
  • inner joinについて

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。