2017-01-09 22 views
0

嗨,我已經打了一個問題,我的SQL查詢,我有一個包含3列,一個用於車輛品牌,一個用於模式,一個用於模型版本的表檢查多個列的級聯匹配的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 

到目前爲止好,這將輸出「雷諾R4 R4 1.1 GTL」如果我鍵入「雷諾」 ......這裏的問題當用戶插入類似雷諾R4,而不僅僅是來「雷諾」

因爲他們已經包含在型號名稱以及該品牌那麼它並沒有真正匹配任何我的數據庫列和我的Ajax調用返回沒有結果的。 我需要從該concat中查詢實際結果集,以便用戶輸入的內容與結果匹配,但我不知道如何執行此操作。

無奈之下,我試圖輸入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全文索引正在恢復一切,如果我對陣雷諾R4返回雷諾的所有實例,而不僅僅是匹配字符串的那些... :( – JonnySerra

+0

匹配,對運營商的回報得分這個行與查詢有多相關,你可以按照分數對行進行排序,並首先提供最好的匹配,並且還有更多的選擇如何使用全文 - 查看文檔並稍微玩一下。 –

0

我只能想到這一個,但我相信有更好的方法來做到這一點。

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