在TP中,根据某一值在字符串数据字段中进行内容匹配

95 阅读1分钟

需求分析:

在一些常见业务中,我们在对多选数据进行保存时,通常会将数据以【 , 】分割的形式进行保存到相应字段值中,这造成了我们在查询时,不方便编写一个通用的查询条件,通常还会将数据进行重新组装使用,相当麻烦。

需求解决

假设你使用的是 MySQL 数据库,使用 LIKE 和 FIND_IN_SET 函数来实现这一需求。

以下是一个示例,展示了如何编写一个 SQL 查询,以匹配 cameraid 字段中的单个值或逗号分隔的值。

示例数据表

IDcameraid
11
22,5
31,3
44
56,10

查询条件

假设你想匹配 cameraid 字段中包含 1的记录。

  $camerId =  1;
  $projects = Db::name('project') 
            ->where('cameraid', '=', $camerId) 
            ->whereOr("FIND_IN_SET(?, cameraid) > 0", [$camerId])
            ->select(); 

关于优化

由于 FIND_IN_SET 函数在逗号分隔的字符串中查找值时性能可能较差,特别是当表数据量较大时,你可以考虑以下优化措施:

  1. 数据规范化:将 cameraid 字段拆分成多个记录,使用关联表来存储每个 camera 的多个 id
  2. 全文索引:如果数据库支持全文索引,可以考虑使用全文索引来加速查找。

示例:数据规范化

假设你有一个新的表 camera_ids,用于存储每个 camera 的多个 id

camera_idid
110
211
212
313
411
414
415
512
Project::alias('a')->join('camera_ids b','a.id = b.camera_id')->whereIn('b.id', [11, 12])->select()->toArray();

感谢观看,共同学习进步~ Tomorrow will be better