2016-04-15 43 views
1

我有一個基於用戶的輸入搜索庫存號碼的查詢。我試圖找到最接近匹配輸入的前5個項目。如果股票號碼完全匹配,請先顯示該項目。如何訂購用於搜索價值=或類似的查詢

SELECT 
    ID, Stock 
    FROM `store_items` 
    WHERE Stock = '$query' OR Stock LIKE '%$query%' LIMIT 5 

所以,如果在我的數據庫我有以下股票#的:

MC-10 
MC-11 
MC-12 
MC-100 
MC-102 
MC-103 

我搜索MC-10,確切的結果應該首先顯示,其次是其他比賽,它就像:

MC-10 
MC-100 
MC-102 
MC-103 

我該如何做ORDER BY這個查詢的一部分,使之發生?

+0

你可以看看這個話題:http://stackoverflow.com/questions/7744108/order-rows-in-sql-query-based-on-which-rows-meet -condition-first – fonfonx

回答

0

你可以嘗試像

ORDER BY CAST(SUBSTRING(Stock,LOCATE('-', Stock) +1, LENGTH(Stock) - LOCATE('-', Stock)) AS INT); 
0

使用

ORDER BY Stock = '$query' DESC 

TRUE作爲1FALSE0處理,因此這將首先命令相等行。

0

我會按照Levenshtein距離的結果來做這件事,但它可能並不快。

這個地方我抓住萊文斯坦的實現在MySQL的是:https://jonlabelle.com/snippets/view/sql/mysql-levenshtein-distance-algorithm

(我不會抄襲的回答爲谷歌會找到你很多例子)

這裏是小提琴例如:http://sqlfiddle.com/#!9/099a4/1所以您的查詢將是這樣的:

Select *, levenshtein_ratio('MC-10', productName) From ForgeRock WHERE productName like '%MC-10%' 
ORDER BY levenshtein_ratio('MC-10', productName) desc, productName ASC 
+0

如果你的需求是直的轉發並通過其他兩個答案解決,這個解決方案是矯枉過正的。 – Matthew