需求分析:
在一些常见业务中,我们在对多选数据进行保存时,通常会将数据以【 , 】分割的形式进行保存到相应字段值中,这造成了我们在查询时,不方便编写一个通用的查询条件,通常还会将数据进行重新组装使用,相当麻烦。
需求解决
假设你使用的是 MySQL 数据库,使用 LIKE 和 FIND_IN_SET 函数来实现这一需求。
以下是一个示例,展示了如何编写一个 SQL 查询,以匹配 cameraid 字段中的单个值或逗号分隔的值。
示例数据表
| ID | cameraid |
|---|---|
| 1 | 1 |
| 2 | 2,5 |
| 3 | 1,3 |
| 4 | 4 |
| 5 | 6,10 |
查询条件
假设你想匹配 cameraid 字段中包含 1的记录。
$camerId = 1;
$projects = Db::name('project')
->where('cameraid', '=', $camerId)
->whereOr("FIND_IN_SET(?, cameraid) > 0", [$camerId])
->select();
关于优化
由于 FIND_IN_SET 函数在逗号分隔的字符串中查找值时性能可能较差,特别是当表数据量较大时,你可以考虑以下优化措施:
- 数据规范化:将
cameraid字段拆分成多个记录,使用关联表来存储每个camera的多个id。 - 全文索引:如果数据库支持全文索引,可以考虑使用全文索引来加速查找。
示例:数据规范化
假设你有一个新的表 camera_ids,用于存储每个 camera 的多个 id:
| camera_id | id |
|---|---|
| 1 | 10 |
| 2 | 11 |
| 2 | 12 |
| 3 | 13 |
| 4 | 11 |
| 4 | 14 |
| 4 | 15 |
| 5 | 12 |
Project::alias('a')->join('camera_ids b','a.id = b.camera_id')->whereIn('b.id', [11, 12])->select()->toArray();
感谢观看,共同学习进步~ Tomorrow will be better