我在Codeigniter中有一个项目,用户可以在其中搜索多个类别。在我的数据库中,类别字段是逗号分隔的字符串(46,53,76(。
当用户在过滤器(46(中选择类别并与数据库中的第一个类别匹配时,它可以正常工作,但如果用户选择另一个类别(53(,查询就不能正常工作。当用户选择多个类别时,也会出现类似的问题。
我的代码类似于:
if(!empty($category)) {
$cat_array = explode(',', $category);
$count_items = count($cat_array);
if($count_items == '1') {
$this->db->where("find_in_set($category, po_category)");
} else {
$this->db->group_start();
$count = 0;
foreach($cat_array as $item) {
$count++;
if($count == '1') {
$this->db->where("find_in_set($item, po_category)");
} else {
$this->db->or_where("find_in_set($item, po_category)");
}
}
$this->db->group_end();
}
}
我想知道"find_in_set"在这种结构中是否有效。
在我的数据库中,类别字段是逗号分隔的字符串(
'46, 53, 76'
(。当用户在过滤器(
46
(中选择类别并与数据库中的第一个类别匹配时,它可以正常工作,但如果用户选择另一个类别(53
(,则查询无法正常工作。
您的值列表中没有53
!它包含与要搜索的值不同的值' 53'
(带前导空格字符(。所以你们的搜索结果是否定的。
SELECT FIND_IN_SET( 53 , '46, 53, 76'),
FIND_IN_SET( '53', '46, 53, 76'),
FIND_IN_SET(' 53', '46, 53, 76');
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=81f440fd21b450924f21e769039d1db
PS。尾部空间也被考虑在内。
po_category
字段中逗号后有空格。
所以你需要删除它。
你可以试着那样做。
$this->db->where("find_in_set($item, REPLACE(po_category, ' ', ''))");
$this->db->or_where("find_in_set($item, REPLACE(po_category, ' ', ''))");