2016-04-15 7 views
1

Ich habe eine Abfrage, die auf der Grundlage einer Benutzereingabe nach Bestandsnummern sucht. Ich versuche, die Top 5 Elemente zu finden, die am ehesten dem Input entsprechen. Wenn eine Materialnummer genau übereinstimmt, zeigen Sie diese zuerst an.So bestellen Sie die Abfrage für die Suche wo Wert = oder ist LIKE

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

Also, wenn in meiner Datenbank habe ich die folgenden Lager # 's haben:

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

Und ich suche nach MC-10 sollte das genaue Ergebnis zeigen erste, von anderen gefolgt übereinstimmt, dass es LIKE :

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

Wie mache ich den ORDER BY Teil dieser Abfrage das geschieht?

+0

Sie zu diesem Thema aussehen: http://stackoverflow.com/questions/7744108/order-rows-in-sql-query-based-on-which-rows-meet -Zustand – fonfonx

Antwort

0

können Sie versuchen, wie

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

Verwenden

ORDER BY Stock = '$query' DESC 

TRUE als 1 und FALSE behandelt wird, ist 0, so wird dies zunächst die gleiche Reihe bestellen.

0

Ich würde das Ergebnis von Levenshtein Entfernung bestellen, um dies zu tun, aber es kann nicht schnell sein.

Dieser Ort, den ich von einer Implementierung von Levenshtein in MySQL packte ist: https://jonlabelle.com/snippets/view/sql/mysql-levenshtein-distance-algorithm

(Ich werde nicht für die Antwort plagiieren wie Google Sie viele Beispiele finden)

Hier eine Geige Beispiel ist: http://sqlfiddle.com/#!9/099a4/1 so Ihre Anfrage wird wie folgt aussehen:

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

Wenn Ihr Bedarf gerade ist Vorwärts und durch die anderen beiden Antworten gelöst, ist diese Lösung übertrieben. – Matthew

Verwandte Themen