如何用LIKE或其他方法匹配字段前两位/逗号前内容从数据库取数
解决方案:匹配main_category字段首段为指定值的记录
你的问题核心是要筛选main_category字段中,目标值(比如12)是第一个逗号前的内容(或字段本身就是目标值)的记录,而原来的LIKE "%$sector%"会匹配所有包含该值的记录,所以会误选第二条数据。下面是具体的解决方法:
方法1:使用LIKE匹配两种场景
我们需要覆盖两种符合要求的情况:
- 字段值完全等于目标值(比如
main_category = '12') - 字段值以
目标值+逗号开头(比如main_category LIKE '12,%')
结合你的ORM查询逻辑,修改后的代码如下:
$getResult = $companies->where('company_name', 'LIKE', "%$keyword%") ->where(function ($query) use ($sector) { // 要么字段就是目标值,要么以目标值加逗号开头 $query->where('main_category', '=', $sector) ->orWhere('main_category', 'LIKE', "$sector,%"); }) ->get();
方法2:使用正则表达式简化条件
如果你的数据库支持正则表达式(比如MySQL、PostgreSQL都支持),可以用更简洁的正则规则匹配:
匹配字段开头是目标值,后面要么是逗号要么是字段结束的情况,正则表达式为^$sector(,|$)。
对应的代码实现:
$getResult = $companies->where('company_name', 'LIKE', "%$keyword%") ->where('main_category', 'REGEXP', "^$sector(,|$)") ->get();
验证结果
用你的示例数据测试:
- 第一条记录
main_category = '12,3,6'满足LIKE '12,%',会被选中 - 第二条记录
main_category = '1,12,9'既不等于'12',也不以'12,'开头,所以不会被选中
完全符合你的预期结果。
小提醒
如果$keyword和$sector是用户输入的内容,一定要注意SQL注入风险,建议使用ORM框架的参数绑定功能传递变量,避免直接字符串拼接。比如在Laravel中可以这样写参数绑定:
$getResult = $companies->where('company_name', 'LIKE', "%?%", [$keyword]) ->where(function ($query) use ($sector) { $query->where('main_category', '=', $sector) ->orWhere('main_category', 'LIKE', "?,%", [$sector]); }) ->get();
内容的提问来源于stack exchange,提问作者abdullah
相关产品推荐
相关产品推荐

