如何使用MySQL的like查询并将精确匹配结果排在前面

22

我正在使用MySQL 5.5,因此无法使用FULLTEXT搜索,请不要建议它。

我的目的是,如果用户有5条记录,例如:

Amitesh
Ami
Amit
Abhi
Arun

如果有人搜索Ami,那么应该首先返回完全匹配的Ami,然后是Amit和Amitesh。


选择*从Person表中,其中name类似于'Ami%'。 - CPM
如果有人只搜索“mi”,那么它也应该返回3条记录,而不需要任何顺序。 - Mohit Bumb
MySQL 5.5为什么不支持FULLTEXT搜索?(https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html) - Gordon Linoff
3个回答

34

你可以做:

select *
from table t
where col like '%Ami%'
order by (col = 'Ami') desc, length(col);

请问一下,查询语句中的length(col)是什么意思? - Mohit Bumb
1
可能会在“Amitech”之前返回“Amit”。 - Vatev
2
如果我想匹配两列,那么如何编写 length(col)? - Govaadiyo

5
SELECT *
FROM table t
WHERE col LIKE '%Ami%'
ORDER BY INSTR(col,'Ami') asc, col asc;

应该在第一个 Order By 中加上一个 DESC 才能按 OP 的要求工作:ORDER BY INSTR(col, 'Ami') DESC, col ASC。话虽如此,还是要感谢!这个方法在启用了 Doctrine 扩展的情况下在 Doctrine/Symfony 中运行得非常好,而所选答案由于 = 符号而出现错误。 - Erdal G.

1
更准确的输出可以使用likeorder by中找到。
SELECT * FROM `table_name` WHERE col LIKE '%ami%' order by (col LIKE 'ami%') desc;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接