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

MySQLのLIKEの使い方で悩んでいます。

Aテーブルのaddressが「大阪府大阪市中央区大手前1-2-3」だとします。
Bテーブルのaddressが「大阪市中央区」だとします。

これをJOINの結合条件として
「AテーブルのaddressにBテーブルのaddressが含まれていたら、結合する」
みたいな条件をしようと

SELECT * FROM a_table INNER JOIN b_table ON a_table.address LIKE '%b_table.address%'

としてみたのですが、上手く行きません。

フィールド同士をLIKEで結合することは出来ないのでしょうか?
ご存じの方は、アドバイスをお願いします。

●質問者: kt26
●カテゴリ:ウェブ制作
✍キーワード:1-2-3 MySQL ON SELECT アドバイス
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● chuken_kenkou
●60ポイント

LIKEのパターン文字列を、文字連結で作るところが不適切です。

SELECT * 
 FROM a_table 
 INNER JOIN b_table
 ON a_table.address LIKE concat('%',b_table.address,'%')

上記の方法で、今回の検索は実現できますが、address列にインデクスがあっても有効利用できないので、

性能を出せません。表の母体データ件数は、何件くらいあるのでしょうか?数百件程度なら、それ程、

顕著には気にならないかも知れませんが。

もし、テーブル設計の見直しが可能なら、以下のようにできればいいのですけどね。

create table a_table
(
 ?中略?
 都道府県名 varchar(4),  -- 都道府県名
 市区名 varchar(16),  -- 市区名
 町名以降 varchar(20);  -- 町名以降
create index a_table_idx1 on a_table(市区名);

create table b_table
(
 ?中略?
 市区名 varchar(16),  -- 市区名
 ?中略?
);
create index b_table_idx1 on b_table(市区名); 

※varchar(n)のnは、MySQL 4.0まではバイト数、MySQL 4.1以降は文字数です。


そして検索は、「=」条件で行い、最終的に表示する住所は、必要ならば文字連結して表示する方法です。

SELECT
 ?中略?
 CONCAT(a.都道府県名,a.市区名,a.町名以降) as address  
 FROM a_table as a 
 INNER JOIN b_table as b
 ON a.市区名=b.市区名
|< 
◎質問者からの返答

ありがとうございます。大変参考になりました。

テーブル設計についても、ぜひ参考にさせていただきます。

関連質問


●質問をもっと探す●



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