Mysql 如何排序查询以搜索value=或类似的位置

Mysql 如何排序查询以搜索value=或类似的位置,mysql,Mysql,我有一个根据用户输入搜索股票编号的查询。我试图找到与输入最匹配的前5项。如果库存编号完全匹配,则首先显示该项目 SELECT ID, Stock FROM `store_items` WHERE Stock = '$query' OR Stock LIKE '%$query%' LIMIT 5 因此,如果我的数据库中有以下股票: 我搜索MC-10,准确的结果应该首先显示,然后是其他类似的匹配: MC-10 MC-100 MC-102 MC-103 如何执行此查询的orderb

我有一个根据用户输入搜索股票编号的查询。我试图找到与输入最匹配的前5项。如果库存编号完全匹配,则首先显示该项目

  SELECT
  ID, Stock
  FROM `store_items`
  WHERE Stock = '$query' OR Stock LIKE '%$query%' LIMIT 5
因此,如果我的数据库中有以下股票:

我搜索
MC-10
,准确的结果应该首先显示,然后是其他类似的匹配:

MC-10
MC-100
MC-102
MC-103
如何执行此查询的
orderby
部分以实现此目的?

您可以像这样尝试

ORDER BY CAST(SUBSTRING(Stock,LOCATE('-', Stock) +1,  LENGTH(Stock) - LOCATE('-', Stock)) AS INT);
你可以试试看

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

TRUE
被视为
1
FALSE
被视为
0
,因此这将首先排列相等的行。

使用


TRUE
被视为
1
FALSE
被视为
0
,因此这将首先对相等的行进行排序。

我将按Levenshtein距离对结果进行排序,但这可能不是很快

我在MySQL中抓取了一个Levenshtein实现的地方是:

(我不会剽窃答案,因为谷歌会为你找到很多例子)

下面是一个fiddle示例:因此您的查询如下所示:

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

我会通过Levenshtein distance命令结果来执行此操作,但它可能不会很快

我在MySQL中抓取了一个Levenshtein实现的地方是:

(我不会剽窃答案,因为谷歌会为你找到很多例子)

下面是一个fiddle示例:因此您的查询如下所示:

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

你可以看看这个主题:你可以看看这个主题:如果你的需求是直接的,并且通过其他两个答案解决,那么这个解决方案就是过度的。如果你的需求是直接的,并且通过其他两个答案解决,那么这个解决方案就是过度的。