You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:24:15