codeigniter 查询where_in逗号分隔列表

o2rvlv0m  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(110)

我有一个'list_table'表看起来像:

id :  list 
1  :  1,2,44,5    
2  :  4,3,5,2,56,66

是否有可能检查'44'是在列表列在mysql数据库?我正在使用codeigniter和我的代码看起来像:

$this->db->select('*'); 
$this->db->from("list_table");
$this->db->where("find_in_set('44', 'list')");
$query = $this->db->get();
return $query->result();

我也尝试了WHERE_IN,但没有得到正确的结果。
这是我在启用_profile时得到的查询:

SELECT *
FROM `poslovi`
LEFT JOIN `firme` ON `firme`.`f_id` = `poslovi`.`po_firma_id`
LEFT JOIN `kategorije` ON `kategorije`.`k_id` = `poslovi`.`po_category`
WHERE `po_date_istek` > '2022-03-21 10:37:25'
AND   (`po_naziv_oglasa` LIKE '%Radnik u ćevabdžinici%' ESCAPE '!' OR  `f_name` 
LIKE '%Radnik u ćevabdžinici%' ESCAPE '!')
AND find_in_set("61", po_category) <> 0
AND `po_status` = '1'
ORDER BY `po_date_istek` DESC
LIMIT 10

这是我数据库里的数据:

顺便提一下,如果我删除“find_in_set”,我会得到正确的结果,因此查询的其余部分就像我注意到的那样很好

wfypjpf4

wfypjpf41#

WHERE子句中需要true或false条件,因此比较

$this->db->select('*'); 
$this->db->from("list_table");
$this->db->where("find_in_set('44', 'list') <> 0");
$query = $this->db->get();
return $query->result();

但不建议以这种方式存储数据。请参阅Is storing a delimited list in a database column really that bad?中的莫尔

z31licg0

z31licg02#

a screenshot you posted of your data中,可以看到您在每个逗号后面包含一个空格。
po_category的值是2, 7, 61,而不是2,7,61-并且find_in_set不会忽略这些空格!
您已经注意到find_in_set在搜索第一个条目时有效,这是因为它没有前导空格; 761都有。
在这种情况下,find_in_set(" 61", po_category)可以匹配,但是如果它第一个条目,它就不匹配。虽然你可以使用(find_in_set("61", po_category) <> 0 || find_in_set(" 61", po_category)) <> 0来支持这两种情况,但这是不必要的缓慢和费力。只要保存你的数据,不要有空格。或者,更好的是,不要作为逗号分隔的列表。

  • nbk's answer中,有一个链接解释了为什么这样做不是最佳的。保存ID列表的一种方法是为它们创建一个单独的表,并使用JOIN。这将提高性能。另一种实现起来稍微复杂一些的方法是,如果您使用MySQL 8.0.17或更高版本,将其保存为JSON数组并为该数组创建索引。*
llycmphe

llycmphe3#

正如nbk所说,您需要true/false条件,但是,答案不适用于OP。您需要删除该答案中list前后的单引号:

$this->db->where("find_in_set('44', 'list') <> 0");

重写代码如下,去掉list前后的引号:

$this->db->select('*'); 
$this->db->from("list_table");
$this->db->where("find_in_set('44', list) <> 0");
$query = $this->db->get();
return $query->result();

这应该能帮你解决问题。

相关问题