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