我有一个'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”,我会得到正确的结果,因此查询的其余部分就像我注意到的那样很好
3条答案
按热度按时间wfypjpf41#
WHERE子句中需要true或false条件,因此比较
但不建议以这种方式存储数据。请参阅Is storing a delimited list in a database column really that bad?中的莫尔
z31licg02#
在a screenshot you posted of your data中,可以看到您在每个逗号后面包含一个空格。
po_category
的值是2, 7, 61
,而不是2,7,61
-并且find_in_set
不会忽略这些空格!您已经注意到
find_in_set
在搜索第一个条目时有效,这是因为它没有前导空格;7
和61
都有。在这种情况下,
find_in_set(" 61", po_category)
可以匹配,但是如果它是第一个条目,它就不匹配。虽然你可以使用(find_in_set("61", po_category) <> 0 || find_in_set(" 61", po_category)) <> 0
来支持这两种情况,但这是不必要的缓慢和费力。只要保存你的数据,不要有空格。或者,更好的是,不要作为逗号分隔的列表。llycmphe3#
正如nbk所说,您需要true/false条件,但是,答案不适用于OP。您需要删除该答案中
list
前后的单引号:重写代码如下,去掉
list
前后的引号:这应该能帮你解决问题。