项目中想要优化一个mysql模糊查询的功能:
业务场景:查出数据库表中字段1或字段2中能够匹配到关键字key的数据,优先显示字段1中匹配的,但是字段2中能够匹配的记录也要显示;
现状:我用的mysql concat(str1, str2)的函数,这样虽然能查询出所有匹配的结果,但是不能按优先级让匹配字段1的先展示。
SQL的话先查字段一然后union all 字段二不行吗,不然整elasticsearch检索打分
问题有点模糊,先确认几个点。
我先猜一下,给个sql
select case when 字段1 like '%KEY%' then 字段1 when 字段2 like '%KEY%' then 字段2 end
from 表 where (字段1 like '%KEY%' or 字段2 like '%KEY%');
条件没有用concat的原因是,因为不清楚你数据长啥样,怕字段1的后半截和字段2的前半截组合后刚好和key相似,因此分别写条件。而展示的数据,case when 完美的诠释了优先级的用法
sql 语句大概是这个样子
select ab.field2 ,ab.field5,ab.fieldn,... from ( select 1 as k , ablName.* from ablName where field1 like key UNION select 2 as k , ablName.* from ablName where (not (field1 like key)) and (field2 like key )) as ab ORDER BY ab.k;