2016-04-15 7 views
1

ユーザーの入力に基づいて在庫番号を検索するクエリがあります。私は入力に最もよく一致する上位5項目を見つけようとしています。在庫番号が正確に一致する場合は、その項目を最初に表示します。value =またはLIKEで検索するためのクエリの注文方法

だから、
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を検索、正確な結果は、それがLIKEであることその他の試合に続いて、最初に表示されるはずです:

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

私はそれを実現するために、このクエリのORDER BY一部をどのように行うのですか?

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

:あなたのクエリは次のようになりますhttp://stackoverflow.com/questions/7744108/order-rows-in-sql-query-based-on-which-rows-meet -condition-first – fonfonx

答えて

0

あなたが試すことができますので、これは最初に等しい行を注文します。

0

使用

ORDER BY Stock = '$query' DESC 

TRUE1とある0FALSEとして扱われるように

0

私はこれを行うためにLevenshtein距離で結果を注文しますが、それは速くないかもしれません。

私からのMySQLでレーベンシュタインの実装をつかんでこの場所は次のとおりですので、http://sqlfiddle.com/#!9/099a4/1https://jonlabelle.com/snippets/view/sql/mysql-levenshtein-distance-algorithm

(Googleはあなたに多くの例がありますように私は答えを盗用しません)

ここではフィドル例ですあなたはこのトピックを見てもよい

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

あなたの必要がまっすぐな場合他の2つの答えによって解決され、この解決法は過剰です。 – Matthew

関連する問題