我正在处理一个联接查询,其中我必须从包含逗号分隔值的列中获取数据。allowed_activity
包含1,2,3,4,5,6
这就是activity_id
这是允许的。
因此,在查询中,我正在检查当前活动是否允许,为此,我使用了where_in
并且也尝试过find_in_set
in where
健康)状况。
这是查询的一部分:
$this->db->where_in('a.allowed_activity',$activity_id);
//And With FIND_IN_SET
$this->db->where("FIND_IN_SET($activity_id, a.allowed_activity) !=",0);
问题或困惑
当我使用where_in
它没有给我结果。但如果我使用FIND_IN_SET
然后它会返回所需的结果。我以为where_in
可以完成任务,但没有。
只是想知道为什么find_in_set
工作方式不同于where_in
因为这两个函数的工作方式与在逗号分隔列表中查找数据相同。
这是完整的查询:
SELECT mycolumns
FROM `table1` as `ea`
LEFT OUTER JOIN `table2` as `a` ON `ea`.`package_id` = `a`.`id`
LEFT OUTER JOIN `table3` as `e` ON `ea`.`employer_id` = `e`.`id`
WHERE `ea`.`card_id` > 0
AND FIND_IN_SET(6, a.allowed_activity) !=0
AND `ea`.`id` = '6'
ORDER BY `ea`.`creation_date` DESC
我正在使用 Codeigniter 活动记录。
WHERE IN
要求在查询中按字面指定值集,而不是包含逗号分隔字符串的单个值。如果你写:
WHERE 6 IN (a.allowed_activity)
它会治疗a.allowed_activity
作为单个值,并将其与6
,而不是作为一组多个值进行搜索。
FIND_IN_SET
在逗号分隔的字符串中搜索值。
另一种查看方式是IN
是一堆的捷径=
测试结合OR
:
WHERE x IN (a, b, c, d)
是缩写
WHERE x = a OR x = b OR x = c OR x = d
当您像这样重写它时,您可以清楚地看到为什么它不适用于包含逗号分隔字符串的列。简单翻译一下就是
WHERE 6 IN (a.allowed_activity)
to:
WHERE 6 = a.allowed_activity
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)