对于某些客户,我正在使用一个使用MySQL数据库的项目。
我需要实现一个搜索功能,该功能应该能够在数据库中搜索具有所有选定功能的设备。我正在使用CodeIgniter。问题是表格的结构。
我发现该表包含2列:ID_D
(设备的ID)和ID_F
(功能的ID)。基本上该表不包含任何主键(这就是为什么我根本不能执行任何连接)。
因此,对于每个功能,设备ID也可能出现在10行中。当我执行搜索时,我有一个功能ID列表,我应该只能读取具有所有功能的设备。
if (isset($feature_array)) {
foreach($feature_array as $key => $row) {
$this->db->where('f_id',$row['f_id']);
}
}
当然,类似的东西不会起作用。有什么想法吗?
答案 0 :(得分:0)
我认为这可能会解决您的问题,以防功能ID是唯一的并且不包含空格。如果它们包含空格,则应选择一个不在特征ID范围内的分隔符。
基本上,代码使用mySQL group_concat函数来连接所有特征ID,并匹配所有搜索特征创建的字符串。这将找到至少支持给定功能集的所有设备。
CI本身不支持该功能,因此它在select方法中由workarround添加。
如果在大型表上调用它,这可能会有点负载。也许其他人有更快的解决方案?
$this->db->select(['ID_D', 'GROUP_CONCAT(ID_F SEPARATOR \' \']) as id_f_concatenated']);
foreach($feature_array as $row) {
$this->db->where("id_f_concatenated REGEXP '{$row['id_f']} | {$row['id_f']}|^{$row['id_f']}$'");
}
$this->db->group_by('ID_D');
$result = $this->db-get('tablename');
编辑: 将LIKE更改为REGEXP以确保功能ID 112与id 12不匹配,而不会使表达式变得复杂。