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

下記の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 です。

よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AAA CCC DDD MySQL ON
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● riatan
●20ポイント

今構文チェックができる状態にないのでちょっと自信がないですが、

「WHERE t1.* LIKE '%テスト%'」これは構文的にありなのでしょうか・・?

列を明示的に指定しなければいけないと思ったのですが、違っていたらごめんなさい。

あと、エラーがでないで返事がないというのは

単に重くて固まっている可能性もあるのではないかと思います。

%テスト% というLIKEの文を使うと、

インデックスが使えないので非常にコストがかかる検索方法になります。

データ量が多いのでしたら、これが原因かもしれません。

◎質問者からの返答

ありがとうございます。

「%テスト%」は、例えば住所に「xxx市を含む行を検索」としたいので

どうしても使わなければなりません。

他の回答も待ってみます。


2 ● chuken_kenkou
●80ポイント

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を利用することも検討してみてください。

◎質問者からの返答

ありがとうございます。

色々と勉強になる事を沢山教えていただきありがとうございました。

> 単純に「concat(t1.aaa,t1.bbb,t2.ccc)」のように列連結すると、区切りがないので、意図したデータ以外もヒットしてしまいます。

間にスペースなどを入れるにはどうすれば良いのでしょうか。

concat(t1.aaa,' ',t1.bbb,' ',t2.ccc)

こんな感じですか。

また、t1.aaa、t1.bbb、t1.ccc、t1.ddd.....と、沢山の項目から検索したい場合、

concat(t1.aaa,t1.bbb,t2.ccc)と言う様にするのと、

WHERE t1.列名1 LIKE 'パターン文字列'

OR t1.列名2 LIKE 'パターン文字列'

OR t1.列名3 LIKE 'パターン文字列'

というようにするのでは、一般的にはどちらが良い。と言うような事はあるのでしょうか。

関連質問


●質問をもっと探す●



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