3つのテーブルを連携した並び替えのSELECT文

このQ&Aのポイント
  • 3つのテーブルを連携した並び替えのSELECT文について教えて下さい。
  • 3つのテーブルを使ってレコードを並び替えたい場合、どのようなSELECT文を書くと良いでしょうか?
  • COOK_TBL、ZAIRYO_TBL、COOK_KIOKU_TBLの3つのテーブルを連携して、COOK_TBLのレコードを特定の順序で取得する方法を教えてください。
回答を見る
  • ベストアンサー

3つのテーブルを連携した並び替えのSELECT文

3つのテーブルを連携した並び替えのSELECT文について教えて下さい。 例えば次の3つのテーブルがあるとします。 COOK_TBL ---------------- COOK_NAME パスタ パスタ グラタン オムライス グラタン カレー ZAIRYO_TBL --------------- COOK_NAME ZAIRYO_NAME グラタン  鶏肉 オムライス 卵 オムライス 玉ねぎ パスタ   卵 パスタ   麺 COOK_KIOKU_TBL --------------- COOK_NAME オムライス グラタン COOK_TBLのCOOK_NAMEでグルーピングしたものに対し、ZAIRYO_TBLのCOOK_NAMEに存在するものは全て抽出し、 COOK_KIOKU_TBLのCOOK_NAMEとCOOK_TBLのCOOK_NAMEと一致するレコードは頭の方(COOK_KIOKU_TBLのCOOK_NAMEのレコード順)に並び替えられるようにしたいです。 得たい結果は次の通りです。 COOK_TBL ------------- COOK_NAME オムライス グラタン パスタ どうしても分かりません。 助けて下さい。 os: windows 7 eclipse: Version: 4.2.0

  • MySQL
  • 回答数1
  • ありがとう数13

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>COOK_KIOKU_TBLのCOOK_NAMEとCOOK_TBLのCOOK_NAMEと一致するレコードは頭の方 というのであればCOOK_KIOKU_TBLに順位を確定させるためのソートキーが必要 それぞれidをふるとするとこんな感じかな? create table COOK_TBL(cid int not null primary key auto_increment,COOK_NAME varchar(10)); insert into COOK_TBL(COOK_NAME) values('パスタ'),('パスタ'),('グラタン'),('オムライス'),('グラタン'),('カレー'); create table ZAIRYO_TBL(zid int not null primary key auto_increment,COOK_NAME varchar(10),ZAIRYO_NAME varchar(10)); insert into ZAIRYO_TBL(COOK_NAME,ZAIRYO_NAME) values('グラタン','鶏肉'),('オムライス','卵'),('オムライス','玉ねぎ'),('パスタ','卵'),('パスタ','麺'); create table COOK_KIOKU_TBL(kid int not null primary key auto_increment,COOK_NAME varchar(10)); insert into COOK_KIOKU_TBL (COOK_NAME) values('オムライス'),('グラタン'); //表示 SELECT DISTINCT k.kid,c.COOK_NAME FROM COOK_TBL as c INNER JOIN ZAIRYO_TBL as z ON c.COOK_NAME=z.COOK_NAME LEFT JOIN COOK_KIOKU_TBL as k ON c.COOK_NAME=k.COOK_NAME ORDER BY COALESCE(k.kid,9999); →kidがnullになる場合は適当に大きなデータにしておく(手抜き) →kid以外のソートが設定されていないので、ソート順は必ずしも一意にならない

yanagihk
質問者

お礼

回答ありがとうございます。 各テーブルの定義まで書いた方がよかったかなと少し反省しています。 見たこともない文字を使ったSQLの回答でしたので、自分でできるわけがなかったなとも感じてます。 回答は何となく分かりましたが、いただいたSQLを調べて勉強します。 助かりました。本当にありがとうございます。

関連するQ&A

  • MSAceess テーブル結合でメモリエラー

    Windows XP, MS Access 2007です。 レコード件数700件程度のテーブルTBLに以下のようなカラムがあります。 ID(主キー),NAME,REF_ID1, REF_ID2, REF_ID3,...., REF_ID10 NAMEは当該IDに紐づく名前であり、 REF_ID1~REF_ID10は、当該レコードと関連するレコードのIDを記載したものです。 これをレポート出力する際に、 関連レコードはIDではなく名前を出力したく 以下のようにクエリを作成しました。 SELECT TBL.ID, TBL.NAME, TBL1.NAME AS REF_NAME1, ...., TBL10.NAME AS REF_NAME10 FROM TBL, TBL AS TBL1, TBL AS TBL2, ..., TBL AS TBL10 WHERE TBL.REF_ID1 = TBL1.ID AND ... AND TBL.REF_ID10; しかし、この方法だと結合するテーブル数が多くなるためか、 レポートの表示が非常に遅く、かつ、レポートの最後のページを開こうとすると メモリ不足とのメッセージボックスが出力され、エラー終了してしまいました。 メモリはOSの限界4GBまで積んでいるため、 結合するテーブル数が多すぎるのが問題なのだと思いますが、 どのような方法がよいのでしょうか。

  • カラムで括ったMAX値のselect

    Mysql5.0.18です よろしくお願いします テーブル:test_tblです key:キー name:生徒氏名 test_name:テストの名前 value:点数 下記のようなデータを用意しました key  name  test_name  value 1    A    test1   30 2    A    test2   50 3    B    test1   40 4    B    test2   80 5    C    test1   90 6    C    test2   90 下記のように 生徒(name)毎の最高点のレコードを1件づつ抽出したいのですが 可能でしょうか? key  name  test_name  value 2    A    test2   50 4    B    test2   80 5    C    test1   90 私は下記のsqlでチャレンジしてダメでしたTT Select test_tbl.key, test_tbl.name, test_tbl.test_name, Max(test_tbl.value) as value From test_tbl Group By test_tbl.name Order By test_tbl.name Asc, test_tbl.test_name Asc 結果は・・・ key  name  test_name  value 1    A    test1   50 3    B    test1   80 5    C    test1   90 です・・・ Max関数を使えば、生徒のMAX点が出力されるのは 分かるのですが、そのMAX点のレコードを抽出するには・・・ という所で行き詰っています よろしくお願いします

    • ベストアンサー
    • MySQL
  • 2つの関連するテーブルで指定した値を条件に取得したい

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ 「tbl1s」テーブルの行を「tbl2s」テーブルのnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「sato」を条件にした場合は、 テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  3  | +------+ を取得したいです。

    • ベストアンサー
    • MySQL
  • 2つの関連するテーブルで指定した値を条件orで取得したい

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+-------+ |  id  | club | +------+-------+ |  1  | 野球 | +------+-------+ |  2  | テニス| +------+-------+ |  3  | サッカー| +------+-------+ +------+-------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ というテーブル構成で、「tbl1s」テーブルの行を 「tbl1s」のclubかない場合には「tbl2s」のnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「テニス」を条件にした場合は、「tbl2s」のnameにはないですが「tbl1s」のclubには合致するのがあるので テーブル「tbl1s」 +------+ |  id  | +------+ |  2  | +------+ を取得したいです。

    • ベストアンサー
    • MySQL
  • MySQLで別テーブルを参照し、レコードを消したい

    お世話になります。MySQL4のデータベース上に2つのテーブルがあるのですが、 片方のテーブル(a)にあるフィールド(b_id)の値を参照し、もう片方のテーブル(b)のレコードを消していきたいのです。 具体的には以下のようなテーブル(a)とテーブル(b)があります。 TBL: a =========================== id    b_id    category =========================== 0     1       3 --------------------------- 1     2       1 --------------------------- 2     3       2 --------------------------- 3     4       2 --------------------------- TBL: b =========================== id    name    price =========================== 0    goodsA   1,000 --------------------------- 1    goodsB   500 --------------------------- 2    goodsC   250 --------------------------- 3    goodsD   2,500 --------------------------- 4    goodsE    1,800 --------------------------- やりたいことは、テーブル(a)の「category」フィールドが「2」以外であれば、 そのレコードの「b_id」にある数値を「id」にもつ、テーブル(b)のレコードを消していきたいのです。 上記の例だと、テーブル(a)のid「0」と「1」がcategoryに「2」以外を持っています。 この2つのレコードのb_idは「1」と「2」ですので、テーブル(b)のid「1」と「2」を消したいと思っています。 SQLについて知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。

  • 表の結合について

    2つのテーブルがあります。(それぞれNo列が主キーです) 表A(名称:Tbl_A)に2レコードあります。 No, Str  ←列名 10,str_1  ←データ 20,str_2  ←データ 表B(名称:Tbl_B)に2レコードあります。 No, Name  ←列名 10,Name_1 ←データ 30,Name_3 ←データ このテーブルを結合して、以下のデータ(3レコード)を抽出するSQL文を教えてください。 No, Str, Name   ←列名 10,str_1,Name_1 ←データ 20,str_2,(null) ←データ 30,(null),Name_3 ←データ ポイントは、「どちらかの表にあるデータは全て抽出したい」ということです。 よろしくお願いします。

  • データベースに検索条件を保存する事は出来るのか?

    データベースに検索条件を保存する事は出来るのか? 検索用のシステムを作成しているのですが、 システムの構造上 検索条件を表示する検索ページを動的に作る必要があるのですが、 レコードを追加する度に検索条件が増える事を考えておかなければいけません。 例 cook_table (name,condition,text) = ('ゆで卵',/*条件 1,2*/,'卵を茹でた物') ,('温泉卵',/*条件 1,2,3*/,'お湯に温泉をつけた物。茹でた物ではない') ,('目玉焼き',/*条件 1,4*/,'卵を焼いた物') condition_table (id,condition_name, operator, value) = (1, 'material', '=', '卵') ,(2, 'boil', '>', 10) ,(3, 'water_thermometer', '=', 70) ,(4, 'bake', '=', true) イメージとしては、 ユーザが入力した条件に一致するcondition_tableのidを取り出して、そのidに一致するcook_tableの項目を取得するという事をしたいと思っています。 ユーザの入力条件に合わせてcondition_tableのidを取得にはどうしたらいいでしょうか?

    • ベストアンサー
    • MySQL
  • 結合テーブルクエリPrimaryKey取得について

    自己解決できず、どなたかお助けくださいませ。 環境:OS/Win7 ACCESS2010 やりたいことは、結合テーブルのクエリからPrimaryKeyを取得したいのです。 次の2つのテーブルと2つのフィールドを作成したとします。 Tbl_a.Fld_ID / Tbl_a.Fld_Name Tbl_b.Fld.ID / Tbl_b.Fld_Sex ※どちらも Fld_ID フィールド を PrimaryKey 名でINDEX設定します。 ACCESSに次のクエリを作成したとします。 SELECT Tbl_a.Fld_ID, Tbl_a.Fld_Name, Tbl_b.Sex FROM Tbl_a INNER JOIN Tbl_b ON Tbl_a.ID = Tbl_b.ID クエリ名:Q_AandB 次のVBAを作成したとします。 ※引数 VR には10万件の2次元配列 0:ID 1:氏名 2:性別 が入っている Public Sub UpdateExe(Byval VR As Variant) Dim DB As DAO.Database: Set DB = CurrentDB Dim RS As DAO.Recordset: Set RS = DB.OpenRecordset("Q_AandB") Dim Z As Long With RS For Z = 0 To UBound(VR) .Index = "PrimaryKey" ← ここでエラーが出ます。 .Seek "=", VR(Z,1) IF .NoMatch Then .AddNew !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update Else .Edit !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update End If Next Z .RS.Close End With Set RS = Nothing DB.Close: Set DB = Nothing End Sub これを実行すると、「実行エラー'3251': この操作は、このタイプのオブジェクトには 実行できません。」 とのエラーで弾かれてしまいました。 結合テーブルでのプライマリキーの取得がわからず困っております。 以上、何卒よろしくお願い申し上げます。

  • 同じ構造の2つのテーブルで登録済みかを確認したい

    あるデータベースの中に、テーブルAとテーブルBがあります。 テーブルAにはレコードが600件ほど登録されています。 テーブルBは、テーブルAと同じ構造を持ち、レコードが100件ほど登録されています。 この2つのテーブルについて、次のような動作を行うSQL文が知りたいです。 ---------------------------------------------------- テーブルBの任意のレコードについて、「そのレコードのURLの値」と同じURLの値を持つレコードがテーブルAに登録されてない場合、レコードをAに登録する。 なお実行の際、比較するのはURLの値のみであり、URLが同じなら他の値が異なっても登録しないものとする。 ---------------------------------------------------- たとえば、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com テーブルB NAME URL (フィールド名) d ddd.com y eee.com f fff.com g ggg.com としたとき、そのSQL文を実行すると、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com f fff.com g ggg.com となります。 最初はテーブルBをPHPで読み込み、レコード一つ一つを登録済みかチェックしてテーブルAに登録する、という方法を考えました。 しかし、SQLを使っている以上、もっといい方法があるのではないかと思い、質問させていただきました。 このような動作を行うSQL文をどなたか教えてください。 よろしくお願いします。

  • 【Access】条件未入力時、全件ヒットするクエリについて

    下記のテーブルがある場合、下記のクエリを実行すると、下記のような結果になります。 条件1. [Forms]![F_Form]![name]に「ル」と入力 →「ベルト」のレコードを抽出 条件2. [Forms]![F_Form]![name]に何も入力しない。 →「ベルト」「ニット」「ズボン」のレコードを抽出 【クエリ】 SELECT * FROM TBL WHERE (((TBL.NAME) Like IIf(Nz([Forms]![F_Form]![name])='','*','*'+Nz([Forms]![F_Form]![name])+'*'))); 【テーブル(TBL)の中身】 ID NAME 1 ベルト 2 ニット 3  4 ズボン 条件1は意図した動作となっていますが、 条件2は意図した動作をしませんでした。 条件2の場合、全件ヒットしたいと思います。 ただ、上記のクエリではNAME列に値が入っていないID=3の値が抽出できませんでした。 その為、条件2の場合、全件ヒットするクエリの書き方をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。