MySQL LIKE运算符使用问题:搜索Roofing需返回含Roof的所有记录
问题场景
我有一个存储服务类别的数据库表service_categories,表结构及数据如下:
id | created_at | updated_at | service_category 1 | 2022-10-03 08:32:47 | 2022-10-03 08:32:47 | Roofing 2 | 2022-10-03 08:32:47 | 2022-10-03 08:32:47 | Roof Repair 3 | 2022-10-03 08:32:47 | 2022-10-03 08:32:47 | Roof Replacement
当用户搜索“Roofing”时,希望返回上述三条记录,但尝试以下SQL语句后,仅能获取包含完整“Roofing”的第一条记录,无法返回含“Roof”的其他记录:
SELECT * FROM service_categories WHERE 1 AND service_category LIKE '%Roofing%';
SELECT * FROM service_categories WHERE 1 AND service_category LIKE 'Roofing%';
SELECT * FROM service_categories WHERE 1 AND service_category LIKE '%Roofing';
解决方案
方法1:匹配包含“Roof”的所有记录
将LIKE匹配的关键词从Roofing改为Roof,所有包含“Roof”字符串的记录都会被匹配到,刚好覆盖三条目标数据:
SELECT * FROM service_categories WHERE service_category LIKE '%Roof%';
方法2:匹配以“Roof”开头的记录
由于所有目标记录的service_category都以“Roof”开头,也可以使用前缀匹配,性能比全模糊匹配略优:
SELECT * FROM service_categories WHERE service_category LIKE 'Roof%';
说明
你之前的SQL都是基于完整的“Roofing”字符串匹配,而另外两条记录仅包含“Roof”前缀,不包含“Roofing”完整字符串,因此无法被匹配到。调整匹配关键词为“Roof”后,就能覆盖所有目标记录。
内容的提问来源于stack exchange,提问作者Yunus Aslam
相关产品推荐
相关产品推荐

