SQLで複数テーブルの複数カラムからデータを検索する方法について。


前提として以下のテーブルがあります。

■テーブルA
カラム名とデータです。
id,name,hobby
1,山田太郎,卓球
2,加藤花子,卓球と華道
3,和田健二,特になし

■テーブルB
カラム名とデータです。
id,tableA_id,musician,song
1,1,ラルク,虹
2,1,グレイ,however
3,2,Xジャパン,X
4,3,ラルク,花葬

「テーブルAのidカラム」と「テーブルBのtableA_idカラム」でリレーションがあります。

この状況で1つのキーワードを元に、テーブルAから、「テーブルAのname」「テーブルAのhobby」「テーブルBのmusician」「テーブルBのsong」の4つのカラムを検索し、データを取得したいです。

例えば、以下のような感じです。

○「田」でテーブルAのidが1と3のデータを取得。
○「卓球」でテーブルAのidが1と2のデータを取得。
○「ラルク」でテーブルAのidが1と3のデータを取得。
○「花」でテーブルAのidが2と3のデータを取得。

どういったSELECT文を書けば、上記が実現できるでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/19 16:03:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

ポイント200pt

処理系によって多少書き方に違いがありますので、
質問する場合にはAccess2010とかMySQL5.1.58といった具合に、
環境を書いておくほうが望ましいです
 
下記とりあえずの例です

SELECT a.*, b.*
FROM テーブルA a
LEFT JOIN テーブルB b ON (b.tableA_id = a.id)
WHERE (a.name LIKE '%キーワード%')
    OR (a.hobby LIKE '%キーワード%')
    OR (b.musician LIKE '%キーワード%')
    OR (b.song LIKE '%キーワード%')
;
id:takaponn12

早速の回答ありがとうございます。
環境はMySQL 5.1となります。
試させていただきますね。

2011/11/19 14:53:37
id:windofjuly

サンプルデータ付きMySQL向けコード

CREATE TEMPORARY TABLE `テーブルA`(id int, name text, hobby text);
INSERT INTO `テーブルA` VALUES 
     ( 1, '山田太郎', '卓球' )
    ,( 2, '加藤花子', '卓球と華道' )
    ,( 3, '和田健二', '特になし' )
;

CREATE TEMPORARY TABLE `テーブルB`(id int, tableA_id int, musician text, song text);
INSERT INTO `テーブルB` VALUES 
     ( 1, 1, 'ラルク', '虹' )
    ,( 2, 1, 'グレイ', 'however' )
    ,( 3, 2, 'Xジャパン', 'X' )
    ,( 4, 3, 'ラルク', '花葬' )
;

SELECT DISTINCT a.*
FROM テーブルA a
LEFT JOIN テーブルB b ON (b.tableA_id = a.id)
WHERE (a.name LIKE '%田%')
    OR (a.hobby LIKE '%田%')
    OR (b.musician LIKE '%田%')
    OR (b.song LIKE '%田%')
;
2011/11/19 15:11:05

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

未確認ですが、だいたいこんな感じでいいと思います。

select * from テーブルA A
inner join
テーブルB B
on
A.id=B.tableA_id
where
A.name like "%" + キー + "%"
or
A.hobby like "%" + キー + "%"
or
B.musician like "%" + キー + "%"
or
B.song like "%" + キー + "%"


DBの種類やバージョンによって 記述の仕方を変更する必要はあります。

id:a-kuma3 No.2

回答回数4971ベストアンサー獲得回数2153

こんな感じ?

  • 「田」でテーブルAのidが1と3のデータを取得。
select
	A.name, A.hobby, B.musician, B.song 
	from Table_A as A, Table_B as B 
	where A.name like '%田%' and A.id = B.tableA_id

  • 「卓球」でテーブルAのidが1と2のデータを取得。
select
	A.name, A.hobby, B.musician, B.song 
	from Table_A as A, Table_B as B 
	where A.hobby like '%卓球%' and A.id = B.tableA_id

  • 「ラルク」でテーブルAのidが1と3のデータを取得。
select
	A.name, A.hobby, B.musician, B.song 
	from Table_A as A, Table_B as B 
	where B.musician like '%ラルク%' and A.id = B.tableA_id

  • 「花」でテーブルAのidが2と3のデータを取得。
select
	A.name, A.hobby, B.musician, B.song 
	from Table_A as A, Table_B as B 
	where ( A.name like '%花%' or B.song like '%花%' ) and A.id = B.tableA_id
id:windofjuly

「複数テーブルの複数カラムからデータを検索」ということなので、
卓球がhobbyに属するとか、ラルクがmusicianに属しているということは知らずに、
網羅的に一括で検索するって意味だと思いますよ・・・

2011/11/19 14:49:42
id:takaponn12

コメント者の言うとおりです。

2011/11/19 15:00:37
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント200pt

処理系によって多少書き方に違いがありますので、
質問する場合にはAccess2010とかMySQL5.1.58といった具合に、
環境を書いておくほうが望ましいです
 
下記とりあえずの例です

SELECT a.*, b.*
FROM テーブルA a
LEFT JOIN テーブルB b ON (b.tableA_id = a.id)
WHERE (a.name LIKE '%キーワード%')
    OR (a.hobby LIKE '%キーワード%')
    OR (b.musician LIKE '%キーワード%')
    OR (b.song LIKE '%キーワード%')
;
id:takaponn12

早速の回答ありがとうございます。
環境はMySQL 5.1となります。
試させていただきますね。

2011/11/19 14:53:37
id:windofjuly

サンプルデータ付きMySQL向けコード

CREATE TEMPORARY TABLE `テーブルA`(id int, name text, hobby text);
INSERT INTO `テーブルA` VALUES 
     ( 1, '山田太郎', '卓球' )
    ,( 2, '加藤花子', '卓球と華道' )
    ,( 3, '和田健二', '特になし' )
;

CREATE TEMPORARY TABLE `テーブルB`(id int, tableA_id int, musician text, song text);
INSERT INTO `テーブルB` VALUES 
     ( 1, 1, 'ラルク', '虹' )
    ,( 2, 1, 'グレイ', 'however' )
    ,( 3, 2, 'Xジャパン', 'X' )
    ,( 4, 3, 'ラルク', '花葬' )
;

SELECT DISTINCT a.*
FROM テーブルA a
LEFT JOIN テーブルB b ON (b.tableA_id = a.id)
WHERE (a.name LIKE '%田%')
    OR (a.hobby LIKE '%田%')
    OR (b.musician LIKE '%田%')
    OR (b.song LIKE '%田%')
;
2011/11/19 15:11:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません