如何在SQL中优先于一个like语句

时间:2012-08-24 21:40:07

标签: jquery mysql sql search sql-like

我正在构建一个搜索框,用于查询数据库并自动填充以下建议。

我希望能够按以下顺序优先考虑结果:

1 - 完全匹配

2 - 以相同的两个字母开头

3 - 包含数据库中某处的字符串

我有一个SQL语句

SELECT * 
FROM Products 
WHERE ProductName LIKE ? 
OR ProductName LIKE ? 
GROUP BY ProductName 
ORDER BY ProductName ASC 
LIMIT 10

在搜索单词“computer”

的示例中

输入“co”时应显示

  • co <​​/ strong> -co
  • co <​​/ strong> mputer
  • co <​​/ strong> mputer desk
  • ac co <​​/ strong> unt

但在进一步搜索“计算机”时

  • 计算机
  • 电脑 deks

第一个绑定参数包含%computer%,第二个包含c%omputer%

感谢您的帮助,如果您需要澄清,请告诉我们。

3 个答案:

答案 0 :(得分:1)

SELECT * FROM Products WHERE ProductName = ? LIMIT 10 UNION
SELECT * FROM Products WHERE ProductName LIKE ? LIMIT 10 UNION
SELECT * FROM Products WHERE ProductName LIKE ? LIMIT 10

这很好用,第一个?持有'co'第二个?持有'co%'和第三?持有'%co%'

首先优先匹配完全匹配,然后从字符串开始,然后包含字符串。

答案 1 :(得分:0)

在MYSQL中使用UNION来组合您的条件的每个单独查询。有一个超级选择可以给你前10名。

select * 
from (
  -- exact macth
  SELECT 1 as prio, *  
  FROM Products  
  WHERE ProductName = ?  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
  UNION
  -- start with
  SELECT 2 as prio, *  
  FROM Products  
  WHERE ProductName LIKE ?*  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
  UNION
  -- anywhere -- 
  SELECT 3 as prio, *  
  FROM Products  
  WHERE ProductName LIKE *?*  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
)
ORDER BY prio, ProductName ASC  
LIMIT 10 

答案 2 :(得分:0)

不知道这是否有用,因为我不是SQL-Guru而且我从来没有使用过MySQL,但如果你看看这篇帖子

SQL: ORDER BY using a substring within a specific column... possible?

也许这样的事情会起作用:

ORDER BY
CAST(SUBSTRING(ProductName, 1, @ProductName.Count()) AS INT) DESC,  -- Year
CASE
    WHEN issue LIKE @productName THEN 1
    WHEN issue LIKE @productName + '%' THEN 2
    WHEN issue LIKE '%' + @productName THEN 3
END
LIMIT 10

总之祝你好运,希望你解决问题!对我这么睡觉太晚了,如果它不起作用我也会试着看看我的脑子明天是否有效,如果你还没有解决它:)