0

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

我希望能够按以下顺序对结果进行优先排序:

1 - 完全匹配

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

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

我有一条 SQL 语句

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

在搜索单词“computer”的示例中

键入“co”时应显示

  • 可可_
  • 电脑_
  • 电脑
  • 帐户_ _

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

  • 电脑
  • 电脑

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

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

4

3 回答 3

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%”

这首先优先考虑精确匹配,然后从字符串开始,然后包含字符串。

于 2012-08-24T21:55:49.857 回答
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 
于 2012-08-24T21:53:47.603 回答
0

不知道这是否可行,因为我不是 SQL-Guru,而且我从未使用过 MySQL,但如果你看看这篇文章

SQL: ORDER BY 在特定列中使用子字符串...可能吗?

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

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

无论如何祝你好运,希望你能解决问题!对我来说太晚了,所以上床睡觉,如果它不起作用,我明天也会试试我的大脑是否正常工作,如果你还没有解决它:)

于 2012-08-24T22:40:22.570 回答