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

SQLについて教えてください。
下記のような2つのテーブルがあるとします。

このとき例えば「千葉」で検索した場合に、
table1の「b:c」を元に、table2から「川あり」と「谷あり」を取得し、
表示したいのですが、一つのSQL文で書く事は可能でしょうか?

可能でしたら、その文を教えてください。

table1

東京,a:b:c
千葉,b:c
埼玉,a

table2

a,山あり
b,川あり
c,谷あり

よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:SQL 千葉 埼玉 東京 検索
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● chuken_kenkou
●27ポイント

できれば、RDBMS名とバージョンを明記してもらえると、適切なアドバイスができます。

「a:b:c」のようなコロン区切りやカンマ区切りでデータを持つことは、SQLの特性である柔軟な操作が

できなくなるので、別の行で管理することとします。

1.表定義例

create table table1
(pref varchar(10),
 kwdid char(1),
 primary key(pref,kwdid));

create table table2
(kwdid char(1) primary key,
 kwd varchar(20));


2.テストデータの格納例

insert into table1 values('東京','a');
insert into table1 values('東京','b');
insert into table1 values('東京','c');
insert into table1 values('千葉','b');
insert into table1 values('千葉','c');
insert into table1 values('埼玉','a');

insert into table2 values('a','山あり');
insert into table2 values('b','川あり');
insert into table2 values('c','谷あり');


3.検索SQL例

select
 t1.kwdid,t2.kwd
 from table1 as t1
 inner join table2 as t2 
 on t1.kwdid=t2.kwdid
 where pref='千葉'
 order by t1.kwdid
;
◎質問者からの返答

ありがとうございます。

やはりそのようにしないとダメなのでしょうか?

できれば一つのテーブルで処理したいのですが...

無理ですか?


2 ● Foolish_No1
●27ポイント

ORACLEでしか試していませんが

以下で取得はできました。

あまりお勧めはできませんが。。。

定義

CREATE TABLE table1(

COL1 varchar(10),

COL2 varchar(10),

primary key(COL1,COL2)

);

CREATE TABLE table2(

COL1 varchar(10),

COL2 varchar(10),

primary key(COL1,COL2)

);

SELECT

tb2.col2

FROM

TABLE1 tb1

,TABLE2 tb2

WHERE

tb1.COL1 = '千葉'

AND tb1.col2 LIKE ( '%' || tb2.COL1 || '%' )

◎質問者からの返答

ありがとうございます。


3 ● chuken_kenkou
●26ポイント

まったくお勧めできませんが、仮に「a:c」といった情報を一列で管理する場合、どのような方法になるか

一例を提示しておきます。

1.表定義例

create table table1
(pref varchar(10),
 kwdidlst varchar(11),
 primary key(pref,kwdidlst));

create table table2
(kwdid char(1) primary key,
 kwd varchar(20));

2.格納データ例

insert into table1 values('東京','a:b:c');
insert into table1 values('千葉','b:c');
insert into table1 values('埼玉','a');

insert into table2 values('a','山あり');
insert into table2 values('b','川あり');
insert into table2 values('c','谷あり');

3.検索例

select
 t2.kwdid,t2.kwd
 from table1 as t1
 inner join table2 as t2 
 on t1.kwdidlst like concat('%',kwdid,'%')
 where pref='千葉'
 order by t2.kwdid
;

性能上問題になるのは、t1.kwdidlst like concat('%',kwdid,'%')

部分で、MySQLはインデクスを有効利用しないため、母体件数に比例して性能が悪くなります。

◎質問者からの返答

コメント欄へもありがとうございました。

関連質問


●質問をもっと探す●



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