查询 where_in 逗号分隔列表

Query where_in comma separated list

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

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

是否可以检查 mysql 数据库中的列表列中是否有“44”? 我正在使用 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 但没有得到正确的结果。

这是我在 enable_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',我会得到正确的结果,所以查询的其余部分是好的,正如我注意到的那样

您需要 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?

中的更多内容

正如 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();

这应该可以解决您的问题。

在 a screenshot you posted of your data 中,可以看到每个逗号后都包含一个 space。

po_category 的值是 2, 7, 61,而不是 2,7,61——并且 find_in_set 不会忽略那些 space!

您已经注意到 find_in_set 在您搜索第一个条目时起作用,这是因为它没有前导 space; 7 61 可以。

find_in_set(" 61", po_category) 会匹配,在这种情况下,但如果它 第一个条目,它就不会匹配。虽然您可以 (find_in_set("61", po_category) <> 0 || find_in_set(" 61", po_category)) <> 0 来支持这两种情况,但这会不必要地缓慢和费力。无需 spaces 即可保存您的数据。或者,更好的是,不是以逗号分隔的列表。

中有一个 link 解释了为什么这样做不是最佳的。保存 ID 列表的一种方法是为它们创建一个单独的 table 并使用 JOIN。这对性能会更好。如果您使用 MySQL 8.0.17 或更高版本,另一个实施起来稍微复杂一些的选项是将其保存为 JSON 数组并对该数组进行索引。