効率的なSQL文の作成方法について

このQ&Aのポイント
  • SQLの抽出方法について質問があります。会員テーブルとフルーツテーブルを関連付けて、特定の条件に基づいて会員を抽出するためのSQL文を作成しています。しかし、もっと効率的な方法があるかどうか知りたいです。
  • 会員テーブルとフルーツテーブルを関連付けて、特定の条件に基づいて会員を抽出するためのSQL文を作成しています。しかし、もっと効率的な方法があるかどうか知りたいです。より高速な実行を実現するために、適切な結合方法やクエリの最適化方法について教えてください。
  • SQLの抽出方法について質問があります。会員テーブルとフルーツテーブルを関連付けて、特定の条件に基づいて会員を抽出するためのSQL文を作成しています。しかし、もっと効率的な方法があるかどうか知りたいです。データベースのインデックスの活用や適切な結合の仕方など、高速なクエリの書き方について教えてください。
回答を見る
  • ベストアンサー

SQL文について

SQLの抽出方法について質問です。 【会員】テーブル関連 すきなフルーツを複数選択できます。 テーブル【MEMBER】と【MEMBER_FRUIT】2つのテーブルで管理 例: Aさんは「りんご」「みかん」「スイカ」がすきです。 Bさんは「りんご」「メロン」がすきです。 Cさんは「みかん」「スイカ」がすきです。 テーブル【MEMBER】 ID、MEMBER_CD、MEMBER_NAME 1  10       Aさん 2  20       Bさん 3  30       Cさん ・ ・ テーブル【MEMBER_FRUIT】 ID、MEMBER_CD、FRUIT_CD 1   10      1 2   10      2 3   10      3 4   20      1 5   20      4 6   30      2 7   30      3 ・ ・ テーブル【FRUIT】 ID、ITEM 1 りんご 2 みかん 3 スイカ 4 メロン 【抽出条件】関連 条件も複数選択できます。 テーブル【SEARCH】と【SEARCH_DETAIL】2つのテーブルで管理 ※会員を抽出条件を管理するテーブル テーブル【SEARCH】 ID、TITLE 1 「りんご」または「メロン」がすきな人 2 「スイカ」がすきな人 ・ ・ テーブル【SEARCH_DETAIL】 SEARCH_ID、FRUIT_CD 1         1 1         4 2         3 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・     【SEARCH】のID1の出力結果イメージ MEMBER_CD、MEMBER_NAME 10         Aさん 20         Bさん こんなSQLを作成してみました。 【SEARCH】テーブルをループで1件づつ処理しようと考えています。 他にもっと効率がいいSQLがありますか? よろしくお願いします。 SELECT DISTINCT MEMBER.MEMBER_CD, MEMBER_NAME FROM MEMBER,MEMBER_FRUIT WHERE MEMBER.MEMBER_CD = MEMBER_FRUIT.MEMBER_CD AND MEMBER_FRUIT.FRUIT_CD in ( SELECT FRUIT_CD FROM SEARCH,SEARCH_DETAIL WHERE SEARCH.ID = SEARCH_DETAIL.SEARCH_ID )

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

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

データベースが何か分からないのでAccessで。 SELECT DISTINCT M.MEMBER_CD, M.MEMBER_NAME FROM SEARCH_DETAIL AS SD LEFT JOIN (MEMBER_FRUIT AS MF LEFT JOIN MEMBER AS M ON MF.MEMBER_CD = M.MEMBER_CD) ON SD.FRUIT_CD = MF.FRUIT_CD WHERE SD.SEARCH_ID=1; SEARCHテーブルを結合する必要はなし。 あと蛇足ですが、MEMBERテーブルのID列の存在意義がわかりません。

pos_pos
質問者

補足

kztkさん、ありがとうございます。 DBは、MYSQLのver5です。 SEARCHテーブルは結合する必要ないんですね! 勉強になりました。 「MEMBERテーブルのID列」は確かに意味がありません。 お客さんの要望みたいです。

関連するQ&A

  • アンケート結果を抽出するSQL文について

    SQLの抽出方法について質問です。 【会員】テーブル関連 すきなフルーツを複数選択できます。 テーブル【MEMBER】と【MEMBER_FRUIT】2つのテーブルで管理 例: Aさんは「りんご」「みかん」「スイカ」がすきです。 Bさんは「りんご」「メロン」がすきです。 Cさんは「みかん」「スイカ」がすきです。 同様に「好きな色」もテーブルで管理しています。 実際はこのような管理テーブルがアンケートの数だけあります。 テーブル【MEMBER】 ID、MEMBER_CD、MEMBER_NAME 1  10       Aさん 2  20       Bさん 3  30       Cさん ・ ・ テーブル【MEMBER_FRUIT】 ID、MEMBER_CD、FRUIT_CD 1   10      1 2   10      2 3   10      3 4   20      1 5   20      4 6   30      2 7   30      3 ・ ・ テーブル【MEMBER_COLOR】 ID、MEMBER_CD、COLOR_CD 1   10      1 2   10      2 3   10      3 4   20      1 5   20      4 6   30      2 7   30      3 ・ ・ テーブル【FRUIT】 ID、ITEM 1 りんご 2 みかん 3 スイカ 4 メロン テーブル【COLOR】 ID、ITEM 1 赤 2 黄 3 青 4 白 【抽出条件】関連 条件も複数選択できます。 テーブル【SEARCH】と【SEARCH_DETAIL】2つのテーブルで管理 ※会員を抽出条件を管理するテーブル テーブル【SEARCH】 ID、TITLE 1 「りんご」または「メロン」または「赤」または「白」がすきな人 2 「スイカ」または「青」がすきな人 ・ ・ テーブル【SEARCH_DETAIL】 SEARCH_ID、FRUIT_CD 1         1 1         4 2         3 テーブル【SEARCH_COLOR】 SEARCH_ID、COLOR_CD 1         1 1         4 2         3 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・     【SEARCH】のID1の出力結果イメージ MEMBER_CD、MEMBER_NAME 10         Aさん 20         Bさん こんなSQLを作成してみました。 【SEARCH】テーブルをループで1件づつ処理しようと考えています。 他にもっと効率がいいSQLがありますか? よろしくお願いします。 ※SEARCH_IDをどこかで指定しないと... SELECT DISTINCT MEMBER.MEMBER_CD, MEMBER_NAME FROM MEMBER,MEMBER_FRUIT,MEMBER_COLOR WHERE MEMBER.MEMBER_CD = MEMBER_FRUIT.MEMBER_CD AND MEMBER_FRUIT.FRUIT_CD ******************************** in ( SELECT FRUIT_CD FROM SEARCH,SEARCH_DETAIL WHERE SEARCH.ID = SEARCH_DETAIL.SEARCH_ID ) ********************************** AND MEMBER_COLOR.COLOR_CD in( SELECT COLOR_CD FROM SEARCH,SEARCH_COLOR WHERE SEARCH.ID = SEARCH_COLOR.SEARCH_ID ) ***の部分をアンケートの数だけ追加すればいいと 考えていますが... みなさんはこういう場合、どのように対応してますか?

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから りんご=3(行) みかん=2(行) メロン=1(行) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 1     りんご 100 2     りんご 100 3     りんご 100 4     みかん 150 5     みかん 150 6     メロン 250

  • mysqlのSQL文の書き方について

    mysqlでA,Bのテーブルがあるとします。 A ID1 りんご ID3 みかん ID4 ぶどう B ID2 メロン ID3 みかん ID4 ぶどう この二枚のテーブルでどちらかのテーブルに存在すればヒットする ようなselec文はどう書いたらいいのでしょうか。重複する行は、 一行のみ抜き出したいです。 こういうかんじにです。 ID1 りんご ID2 メロン ID3 みかん ID4 ぶどう よろしくお願いします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから みかん=3(行目) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 101   りんご 100 102   りんご 100 103   みかん 150 104   りんご 100 105   みかん 150 106   メロン 250 postgre8.3のためrow_numberが使えません

  • SQL文について教えてください。

    お世話になります。 テーブルを3つ作りました ユーザーテーブル:USER_MS USE_NO USER_NAME 001   太郎 002   次郎 003   三郎 品名テーブル:HINMEI_MS HINMEI_NO HINMEI_NAME 001    りんご 002    みかん 003    イチゴ 嫌いなものテーブル:KIRAI_TR KIRAI_NO USER_NO HINMEI_NO 001001  001   001 002003  002   003 002001  002   001 ※KIRAI_NO=USER_NO.HINMEI_NO と連結してプライマリーキーにした ここで、次郎の嫌いなものを抽出するときには $USER_NO = '002'; $SQL ="SELECT * FROM KITAI_TR A,HINMEI_MS B WHERE A.USER_NO = '$USER_NO'; で抽出できるのですが、 次郎の嫌いでない002みかんだけを抽出するSQL文がわからず苦慮しています。 以前、オラクルでSQLを使ったことがあったのですが、その時はFROM句の後に(SELECT * FORM・・・・) Bなどと書くと通ったのですがMYSQLでは通りませんでした。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • VB.NETでSQLを作る時のカンマの対処

    こんにちは。 タイトルの通りなのですが、VB.NETでSQL文を作りたいのですが、カンマの対処について分からなかったので質問させて頂きました。 例えば、下記のようなテーブルとwindowsアプリケーションフォームがあったとします。 itemテーブル                 フォーム(□はチェックボックスだと思ってください。) item_id  item_cd  item_name        □ りんご ---------------------------------       □ ばなな 0001    0001    りんご        □ みかん 0002    0002    ばなな        □ めろん 0003    0003    みかん 0004    0004    めろん このフォームで、チェックボックスに印が付いているものを、SQL文の条件に加えたいと思っていますが、なかなか上手く書けません。 現在のソース sql="SELECT item_id,item_cd,item_name " _   & "FROM item " _   & "WHERE item_name IN (" If apple.checked = True Then   sql &= "'" & label1.text & "'," End If If banana.checked = True Then   sql &= "'" & label2.text & "'," End If         ・         ・         ・ このやり方だと、sql文の最後にカンマが残ってしまいます。 ですが、前カンマをやったところで構文的におかしくなってしまいます。 このようなとき、どのように対処すればよいのでしょうか? よろしければ、教えてください。

  • PHP SQL 問合せについて

    SQLについて質問いたします。SQL 全般でも結構です。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか?

  • SQL文の書き方について

    SQLServer2005で、次のような品物の単価の履歴を表すテーブルを作りました。「,」は列の区切りです。 ID,Sort,Name,Price,Effective,Time 1,1,りんご,100,True,2009/4/1 2,3,なし,120,True,2009/4/1 3,2,ぶどう,150,True,2009/4/1 4,4,ばなな,80,True,2009/4/1 5,1,りんご,110,True,2009/4/20 6,3,なし,100,True,2009/4/20 7,3,なし,90,True,2009/4/25 8,4,ばなな,False,2009/4/25 このテーブルから、Effectiveが、Trueで、最新の単価をSort順に抽出するSQL文が判りません。 SELECT * FORM テーブル名 WHERE (Effective=1) ORDER BY Sort に、何を加えれば実現可能でしょうか? どなたか?詳しい方がいらっしゃいましたら、教えてください。 SQL文の初心者なので、簡単なことなんでしょうが、よろしくお願いいたします。入門書を読めば読むほど、こんがらかって、困っております。なお、Sortの部分は、正規表現的に問題があるので、見直そうと考えています。

  • SQL文を教えてください

    以下のようなテーブルがあります。 IDとnameは複合ユニークキーとなっています。 ID | name 1 | foo 2 | foo 1 | bar 3 | foo 2 | hoge 3 | bar このテーブルから、nameにfooとbar両方を持つIDを抜き出すSQL文が分からずに困っています。 つまり、fooとbarで検索するとID 1とID 3が、fooとhogeで検索するとID 2がヒットするようなSQL文を知りたいのです。 初歩的な質問なのかもしれませんが、どうしてもSQL文が思いつかず大変困っています。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)