人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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文を書けば、上記が実現できるでしょうか?

●質問者: takaponn12
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●0ポイント

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

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の種類やバージョンによって 記述の仕方を変更する必要はあります。


2 ● a-kuma3
●0ポイント

こんな感じ?

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に属しているということは知らずに、 網羅的に一括で検索するって意味だと思いますよ・・・

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

3 ● うぃんど
●200ポイント ベストアンサー

処理系によって多少書き方に違いがありますので、
質問する場合には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 '%キーワード%')
;

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

うぃんどさんのコメント
サンプルデータ付きMySQL向けコード >|sql| 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 '%田%') ; ||<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ