查询 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 数组并对该数组进行索引。
我有一个 '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 即可保存您的数据。或者,更好的是,不是以逗号分隔的列表。
在