我正在构建一个搜索框,用于查询数据库并自动填充以下建议。
我希望能够按以下顺序优先考虑结果:
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%omputer%
感谢您的帮助,如果您需要澄清,请告诉我们。
答案 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
总之祝你好运,希望你解决问题!对我这么睡觉太晚了,如果它不起作用我也会试着看看我的脑子明天是否有效,如果你还没有解决它:)