- ベストアンサー
複数テーブルからの抽出方法を解説 | SQLデータ抽出の基本
- データを抽出する際、複数のテーブルを結合する方法を解説します。
- 具体的な例として、メンバーテーブルに紐づいて性格テーブルと趣味テーブルを作成しました。このデータから、特定の条件での抽出方法を説明します。
- 例として、「趣味CDが1か3、かつフリーワードとして「犬」を趣味テキストか性格テキストに含むレコードを抽出したい」という条件を考えます。結果としては、会員IDが3の人だけが該当します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
実は問題が山積です 基本的にテーブルの作りがあまりよいとは言えません。 趣味テーブルはIDを紐づけるテーブルにすべきで、 趣味テキストについては別テーブルで管理すべきでしょう。 (性格についてもおなじ) またMySQLのバージョンによってやり方が違います。 一応サブクエリが使える前提で処理を考えます。 それと命題(2)の戻り値は3ではなく2ですよね? また日本語を『フリーワードとして「犬」を趣味テキストか性格テキストに含む』 などはSQLではあまり得意な処理ではなくスピードが出せません。 (英語であれば全文検索を使えるのですが・・) 以上を踏まえて、それでもやりたいということであれば以下のとおり (1)これはサブクエリを使えばそれほど問題ありません。 SELECT M.* FROM メンバーテーブル AS M INNER JOIN ( SELECT DISTINCT 会員ID FROM 趣味テーブル WHERE 趣味CD IN (1,3) ) AS H ON M.会員ID=H.会員ID INNER JOIN ( SELECT DISTINCT 会員ID FROM 性格テーブル WHERE 性格CD IN (1,3) ) AS C ON M.会員ID=C.会員ID (2)性格に「犬」というのが微妙ですがこんな感じで? SELECT M.* FROM メンバーテーブル AS M INNER JOIN ( SELECT 会員ID FROM 趣味テーブル WHERE 趣味テキスト LIKE '%犬%' UNION SELECT 会員ID FROM 性格テーブル WHERE 性格テキスト LIKE '%犬%' ) AS X ON M.会員ID=X.会員ID INNER JOIN ( SELECT DISTINCT 会員ID FROM 性格テーブル WHERE 性格CD IN (1,3) ) AS C ON M.会員ID=C.会員ID