2012-01-16 18 views
0

私はオープンソースのスクリプトに取り組んでいます。 (https://github.com/keverw/Random-Quotes)シンプルなmysql検索エンジン

SELECT * FROM quotes WHERE text LIKE '%$searchTermbox%' AND OR author LIKE '%$searchTermbox%' LIMIT 15 

私はそれがテキストと著者の両方を検索しても、重複を持っていないだろう、単純な検索エンジンを作るしようとしています。何か案は?だから私が "Kevin"を入力すると、その名前の著者とそれらに言及している引用者の両方が表示されます。

どちらかというとどちらかというとどちらかと言えばどちらかというとどちらかというとどちらかというと非常にシンプルなものを書く方法はありますか?私はMySQLで非常に基本的です。

id | text | time | author | approvedは構造体です。また、承認されたニーズ= 1

+1

テーブル構造を表示できますか? –

+0

@Sergey私は何かを忘れていることを知っていた...ありがとう!それを追加しました。 – Keverw

答えて

2

ANDは不要です。

SELECT * 
FROM quotes 
WHERE text LIKE '%$searchTermbox%' 
    OR author LIKE '%$searchTermbox%' 
LIMIT 15 

これは、テキストまたは作成者のいずれか、または両方が$searchTermboxを含むすべての引用符を選択します。

ORを使用すると、ANDのケースも同様にカバーされるためです。デフォルトではa OR ba, b or bothを意味します。

+0

ありがとうございます!できます! – Keverw

1

LIKE '%...'を使用すると、テーブル内のすべてのレコードを個別にスキャンする必要があり、インデックスを利用できないため、一般的に非効率的です。一般に、このタイプの問題のより効率的な方法は、MySQLがサポートする全文索引を使用することである(例えば、http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html参照)。

この方法では、最初にフルテキストインデックスを作成し(1回限りの操作)、特別な構文を使用してデータを照会する必要があります(LIKE演算子の代わりに)。

ALTER TABLE quotes ADD FULLTEXT (author, text); 

そして、同等のクエリ式は以下のように書くことができる:これは提供するべき

SELECT * FROM quotes WHERE MATCH (author, text) AGAINST ('$searchTermbox') 
    AND APPROVED=1 
    LIMIT 15; 

フルテキストインデックスを作成します(引用符を仮定すると、MyISAMテーブルである)、あなたが使用することができますし

以前のクエリと同じ結果が得られますが、特にデータベースが大きい場合は大幅に高速になる可能性があります。