質問: 下記のSQL文は間違っておりますでしょうか? 実行すると返事が無いまま固まってしまいます。 (1) SELECT count(*) FROM table1 t1 INNER JOIN table2 t2 ON t1.co=t2.co WHERE t1.* LIKE '%テスト%' (2) SELECT t1.*,t2.ccc,t2.ddd FROM table1 t1 INNER JOIN table2 t2 ON t1.co=t2.co WHERE concat(t1.aaa,t1.bbb,t2.ccc) LIKE '%テスト%' AND concat(t1.aaa,t1.bbb,t2.ccc) LIKE '%テスト2%' MySQL 4.x です。 よろしくお願いします。
回答: > > WHERE t1.* LIKE '%テスト%' > > > 「t1.*」を条件に使うような構文はありません。 ``` WHERE t1.列名1 LIKE 'パターン文字列' OR t1.列名2 LIKE 'パターン文字列' OR t1.列名3 LIKE 'パターン文字列' ``` のように指定する必要があります。 また、「列名 LIKE '%テスト%'」といった検索条件は、仮にインデクスがあっても有効利用されません。 「concat(t1.aaa,t1.bbb,t2.ccc)」のように、列の結合など、加工したものを条件指定する場合も、仮にインデクスがあっても有効利用できません。 つまり、母体件数が増えれば増えるほど、性能劣化します。 また、単純に「concat(t1.aaa,t1.bbb,t2.ccc)」のように列連結すると、区切りがないので、意図したデータ以外もヒットしてしまいます。 > > 「%テスト%」は、例えば住所に「xxx市を含む行を検索」としたいので > > > どうしても使わなければなりません。 > > > 列を都道府県、市区郡、町名などで分けて構成しておけば、少なくとも「列名 LIKE 'xxx%'」のような前方一致にできるのでは? 全文検索のような使い方をしたいなら、MoSQLを利用することも検討してみてください。