我需要在以下条件下搜索MySQL数据库:
1)如果找到与关键字完全匹配的结果,则返回行数和结果完全匹配的结果。
2)如果未找到完全匹配,则返回行数和部分匹配的结果。
例如,如果关键字为cake
,并且表具有以下行,则搜索应仅返回第1行和第5行。
1| cake
2| pancake
3| cupcake
4| fruitcake
5| cake
6| pie
但是,如果仅存在以下行,则搜索应仅返回2-4行。
2| pancake
3| cupcake
4| fruitcake
6| pie
在两个查询中执行此操作很简单,例如:
SELECT SQL_CALC_FOUND_ROWS fields FROM table WHERE word = `cake`
//PHP checks for number of rows, if 0, do second query
SELECT SQL_CALC_FOUND_ROWS fields FROM table WHERE word LIKE '%cake%'
问题:为了减少访问数据库的次数,有没有办法在单个查询中执行此操作?
我能想到的最好的解决方案是通过OR进行匹配,使用ORDER BY支持完全匹配。但是,如果找到完全匹配项,则要切断部分匹配项,需要对结果进行迭代,如果完全匹配项返回2,000个结果,而部分匹配项又返回5,000个,这是不可行的,但我只想显示前25个,同时仍然显示2,000个
编辑3:
在下面做工作:
SELECT
COALESCE(NULLIF(COUNT(exact.Id), 0), COUNT(partial.Id))
FROM
Test AS partial
LEFT JOIN
Test AS exact ON exact.Id = partial.Id AND exact.Name = 'pi'
WHERE
partial.Name LIKE '%pi%'
我在这里删除了我的上一个文本,因为它是错误的。
编辑4:
以下内容是用TSQL编写的(我不知道正确的MySql语法)并返回实际的行(您可以将其包装在MySql服务器上的StoredProcedure中):
CREATE TABLE #Result (Id int, Name nvarchar(max));
INSERT INTO #Result
SELECT * FROM #YourCakeTable WHERE Name = 'cake'
if(FOUND_ROWS() = 0)
INSERT INTO #Result
SELECT * FROM #YourCakeTable WHERE Name like '%cake%'
SELECT * FROM #Result
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句