2017-01-09 8 views
0

ための複数の列を確認し、私は私のSQLクエリの問題をヒットしましたこんにちは、私は3列を含むテーブルを持っている、車両のための1 ブランドモデル用とモデルバージョンの1は、連結試合のMySQL

だから私のデータは、私はそれが簡単に、ユーザーが自分の車を選択できるようにすること入力して我々の現在のドロップダウンシステムを交換するように求めてきた

BRAND || MODEL || MODEL VERSION 
RENAULT || R4 || R4 1.1 GTL 

のように分割されています。

私はjQueryオートコンプリートを使用していますが、私のクエリは次のようになります。

SELECT DISTINCT CONCAT (brand, ' ', model, ' ', version) as data from vehicles WHERE brand LIKE '%Golf%' OR model LIKE '%Golf%' OR version LIKE '%Golf%' LIMIT 5 

はこれまでのところ、私は「RENAULT」を、この意志出力「RENAULT R4 R4 1.1 GTLを」とても良いと入力した場合、ユーザは単にルノーR4代わりのようなものを挿入したときに...ここでの問題は、 "来ますルノーは、」彼らはモデル名前だけでなく、ブランドを含めてきたように

それは本当に、データベースに私の列のいずれにも一致しないと、私のAjax呼び出しを返さない結果。 代わりにそのコンカットから実際の結果セットを照会して、ユーザーが入力したものが結果と一致するようにする必要がありますが、どうすればいいのか分かりません。

私は絶望して、where data LIKE '%RENAULT R4%'と入力しようとしましたが、これも期待どおりに動作しません。どうすればいいですか?どんな助けもありがとう。

答えて

0

簡単かつ緩やかな方法:文字列をスペースで分割し、各単語を尋ねます。

SELECT ... 
WHERE 
    (brand LIKE '%Renault%' OR model LIKE '%Renault%' OR version LIKE '%Renault%') 
    AND (brand LIKE '%R4%' OR model LIKE '%R4%' OR version LIKE '%R4%') 
LIMIT 5 

このようなクエリではインデックスを使用できないため、非常に遅いです。

さらに複雑ですが、はるかに高速な実装はfulltext indexを使用することです。最新バージョンのMySQL(5.6またはそれ以上)が必要です。古いバージョンは、実際にデータベースではないMyISAMテーブルでのみフルテキストをサポートしています。

CREATE FULLTEXT INDEX idx ON vehicles(brand, model, version); 
SELECT ... FROM vehicles 
WHERE MATCH(brand, model, version) AGAINST('Renault R4') 
LIMIT 5; 

(クエリテストが、あなたのアイデアを得る必要がありません。)

+0

@Josef_KufnerフルテキストインデックスiはルノーR4に対して一致した場合には、その文字列に一致するものだけでなく、ルノーのすべてのインスタンスを返し、すべてのものを返して... :( – JonnySerra

+0

リターンはスコアマッチに対する演算子その行がクエリとどのように関連しているかスコアで行を並べ替え、最もよく一致するものを最初に提供したり、フルテキストの使用方法がいくつかあります。 –

0

私はこれだけを考えることができますが、私はそれを行うには良い方法があると信じています。

OR CONCAT (brand, ' ', model, ' ', version) LIKE '%RENAULT R4%'