where_in 和 find_in_set 之间的区别
difference between where_in and find_in_set
我正在处理一个连接查询,其中我必须从包含逗号分隔的列中获取数据 values.like allowed_activity
包含 1,2,3,4,5,6
这是允许的 activity_id
。
所以在查询中,我正在检查当前的 activity 是否被允许,为此,我使用了 where_in
并且还在 where
中尝试了 find_in_set
条件。
这是查询的一部分:
$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
那么它会 return 想要的结果。我认为 where_in
可以完成任务,但事实并非如此。
Just Want to know why find_in_set
working differently than
where_in
Because of both the function work same as finding the data is in comma separated list.
这是完整的查询:
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 活动记录。
以下代码不正确:
$this->db->where("FIND_IN_SET($activity_id, a.allowed_activity) !=",0);
令我惊讶的是,它甚至可以毫无错误地运行,但一种可能是它正在生成一个 WHERE
子句,该子句将字符串与 0 进行比较。当然,它们永远不会相等,因此这将永远是真的。
如果要调用本机 FIND_IN_SET()
函数,则需要使用 whereRaw()
:
$this->db->whereRaw("FIND_IN_SET($activity_id, a.allowed_activity) !=0");
在这里使用 WHERE IN (...)
是不正确的,因为您将所有值都放在一行中,并用逗号分隔。 WHERE IN
如果您想从多行中过滤某些值,每列都有一个值,那么
就有意义了。
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)
至:
WHERE 6 = a.allowed_activity
FIND_IN_SET
在数组中搜索一个值,然后 return 该值的索引,如果函数不同于 0,则表示该值存在于列表中。
所以代码
this->db->where("FIND_IN_SET(6, a.allowed_activity) !=",0);
表示return值6在a.allowed_activity
中的索引
如果值 return 与 0 不同,则值 6 出现在 a.allowed_activity
中
WHERE ... IN
检查集合中的值但不 return 索引 .. 如果值存在与否,只是 return true 或 false
我正在处理一个连接查询,其中我必须从包含逗号分隔的列中获取数据 values.like allowed_activity
包含 1,2,3,4,5,6
这是允许的 activity_id
。
所以在查询中,我正在检查当前的 activity 是否被允许,为此,我使用了 where_in
并且还在 where
中尝试了 find_in_set
条件。
这是查询的一部分:
$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
那么它会 return 想要的结果。我认为 where_in
可以完成任务,但事实并非如此。
Just Want to know why
find_in_set
working differently thanwhere_in
Because of both the function work same as finding the data is in comma separated list.
这是完整的查询:
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 活动记录。
以下代码不正确:
$this->db->where("FIND_IN_SET($activity_id, a.allowed_activity) !=",0);
令我惊讶的是,它甚至可以毫无错误地运行,但一种可能是它正在生成一个 WHERE
子句,该子句将字符串与 0 进行比较。当然,它们永远不会相等,因此这将永远是真的。
如果要调用本机 FIND_IN_SET()
函数,则需要使用 whereRaw()
:
$this->db->whereRaw("FIND_IN_SET($activity_id, a.allowed_activity) !=0");
在这里使用 WHERE IN (...)
是不正确的,因为您将所有值都放在一行中,并用逗号分隔。 WHERE IN
如果您想从多行中过滤某些值,每列都有一个值,那么
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)
至:
WHERE 6 = a.allowed_activity
FIND_IN_SET
在数组中搜索一个值,然后 return 该值的索引,如果函数不同于 0,则表示该值存在于列表中。
所以代码
this->db->where("FIND_IN_SET(6, a.allowed_activity) !=",0);
表示return值6在a.allowed_activity
中的索引
如果值 return 与 0 不同,则值 6 出现在 a.allowed_activity
WHERE ... IN
检查集合中的值但不 return 索引 .. 如果值存在与否,只是 return true 或 false