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で結合することは出来ないのでしょうか?
ご存じの方は、アドバイスをお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/11/22 00:50:09
  • 終了:2007/11/29 00:55:04

回答(1件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542007/11/22 02:36:56

ポイント60pt

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.市区名
|<   
id:kt26

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

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

2007/11/22 13:16:22

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません