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で結合することは出来ないのでしょうか?
ご存じの方は、アドバイスをお願いします。
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.市区名 |<
ありがとうございます。大変参考になりました。
テーブル設計についても、ぜひ参考にさせていただきます。