我有一个查询,可以根据用户的输入搜索库存号。我试图找到最接近输入的前5项。如果库存编号完全匹配,请先显示该项目。
SELECT
ID, Stock
FROM `store_items`
WHERE Stock = '$query' OR Stock LIKE '%$query%' LIMIT 5
所以,如果在我的数据库中,我有以下股票#' s:
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 :(得分:0)
您可以尝试
ORDER BY CAST(SUBSTRING(Stock,LOCATE('-', Stock) +1, LENGTH(Stock) - LOCATE('-', Stock)) AS INT);
答案 1 :(得分:0)
使用
ORDER BY Stock = '$query' DESC
TRUE
被视为1
而FALSE
被视为0
,因此这将首先排序相等的行。
答案 2 :(得分:0)
我会按照Levenshtein距离来命令结果,但它可能不会很快。
这个地方我在MySQL中抓住了Levenshtein的实现: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