gpt4 book ai didi

php - CodeIgniter 对没有主键的表进行查询

转载 作者:行者123 更新时间:2023-11-29 18:13:29 25 4
gpt4 key购买 nike

对于一些客户,我正在开发一个使用 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']);
}
}

当然,这样的事情是行不通的。有什么想法吗?

最佳答案

我认为这可能会解决您的问题,以防功能 ID 唯一且不包含空格。如果它们确实包含空格,您应该选择一个分隔符,该分隔符不在功能 ID 的范围内。

基本上,代码使用 mySQL group_concat 函数来连接所有功能 id,并通过所有搜索到的功能来匹配创建的字符串。这会找到至少支持给定功能集的所有设备。

CI 本身不支持该功能,因此它是通过 select 方法中的解决方法添加的。

此外,如果在大型表上调用,这可能会造成负载密集。也许其他人有更快的解决方案?

$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 不匹配,而不会使表达式变得复杂。

关于php - CodeIgniter 对没有主键的表进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com