前提として以下のテーブルがあります。
■テーブル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文を書けば、上記が実現できるでしょうか?
処理系によって多少書き方に違いがありますので、
質問する場合には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 '%キーワード%') ;
未確認ですが、だいたいこんな感じでいいと思います。
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の種類やバージョンによって 記述の仕方を変更する必要はあります。
こんな感じ?
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
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
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
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
「複数テーブルの複数カラムからデータを検索」ということなので、
卓球がhobbyに属するとか、ラルクがmusicianに属しているということは知らずに、
網羅的に一括で検索するって意味だと思いますよ・・・
コメント者の言うとおりです。
処理系によって多少書き方に違いがありますので、
質問する場合には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 '%キーワード%') ;
早速の回答ありがとうございます。
環境はMySQL 5.1となります。
試させていただきますね。
サンプルデータ付き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 14:53:37環境はMySQL 5.1となります。
試させていただきますね。
サンプルデータ付きMySQL向けコード
2011/11/19 15:11:05