2011-12-17 11 views
1

私はそれが探している複数の列がある場合、PHPでクエリ文字列を構築する最良の方法は何かを理解しようとしています。PHPでMySQL検索文字列を正しく構築する方法は?

たとえば、データベースにはID、名前、電子メール、日付があります。

私は、入力フィールドを上記の列と照合して検索するように、検索入力フィールドをページに作成しました。最高の方法/それを行う練習は何ですか?

私はこれまでのところ次のようなことをしていますが、 "ダム"検索のようです。まあ

"SELECT * FROM Table WHERE id LIKE '$search%' || name LIKE '$search%' || email LIKE '$search%' || date LIKE '$search%'"; 

作品のこの種が、私は良い方法と、より適切な賢く方法が存在しなければならない感じ。

ありがとう...

+0

あなたが常にすべてのフィールドを検索したい場合は、私は上記の問題は表示されません。 –

+0

@Dagon - 4つの異なる検索入力フィールドを分けて、4つの列すべてを排他的に検索することを意味しますか? –

+0

そのクエリは、それらの条件のいずれかでインデックスを使用しません。つまり、テーブルが大きい場合は非常に遅くなります。機能面では、全文検索や外部検索プログラムを使用することなく、正しいです。 – Corbin

答えて

1

あなたが複数の列を照会していない使用してAND(あなたはORを使用している)しているときは、適切にMySQLの使用インデックスを作成することはできません

あり、常に
、常に人々はデータが小さいと考え、クエリの戦略を最適化する必要がありますされます なぜあなたは4つの索引を作成する必要が を最適化するための努力を過ごすためにわざわざ...しかし真実はあなたが好きに固執したい場合は、あなたのデータは、クエリの

を成長する際に、あなたが知っていないで、
4列の

alter table Table add index on(id); 
alter table Table add index on(name); 
alter table Table add index on(email); 
alter table Table add index on(date); 

とにクエリを変更: - :あなたはそれがSQLインジェクションにつながる可能性が、ユーザーの入力をエスケープしませんでした

  • -

    SELECT * FROM Table WHERE id LIKE '$search%' 
    union distinct 
    SELECT * FROM Table where name LIKE '$search%' 
    union distinct 
    SELECT * FROM Table where email LIKE '$search%' 
    union distinct 
    SELECT * FROM Table where date LIKE '$search%' 
    

    What is Union ?

    オフトピック問題

  • は、入力が何でもよいときにIDを検索する意味がありません
  • 同じ日に行く
+0

私の研究では、MYSQLの文書によると、ワイルドカードが1つしか使用されていない場合(%)、インデックス。しかし、私が2を使用しようとするたびに、私は期待される検索結果を得られません。 –

+0

これは間違っています。この形式 '%something'はインデックスには使用されません。この' something% 'はインデックスを許可します。もちろん、%something%はインデックスにも使われません。 – ajreal

+0

私はそれが私のポストで$ search%を使用していた場所を意味しています。しかし、私が%$ search%を使うと、なぜ結果は違うのですか?だから何を使うの? –

0

私は数年前に同じ質問をしていました。あなたが探している機能の種類については、最も効率的な方法は全文検索です。もちろん、それはスペースのコストで来る。私はこれを効率的に実装する他の方法を見つけませんでした。申し訳ありませんが、ftsがmysqlでサポートされているかわかりません。

+0

mysqlはフルテキスト検索を行いますが、この状況では価値があるかどうかは分かりません。 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html –

関連する問題