【问题标题】:difference between where_in and find_in_setwhere_in 和 find_in_set 的区别
【发布时间】:2018-01-25 12:32:17
【问题描述】:

我正在处理一个联接查询,在该查询中我必须从包含逗号分隔值的列中获取数据。例如 allowed_activity 包含 1,2,3,4,5,6 这是允许的activity_id。

所以在查询中,我正在检查是否允许当前活动,为此,我使用了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,那么它将返回所需的结果。我认为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 活动记录。

【问题讨论】:

    标签: mysql codeigniter where-in find-in-set


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      以下代码不正确:

      $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 会很有意义,每列都有一个值。

      【讨论】:

      • whereRaw 没有任何区别先生,它给出的结果与where @TimBiegeleisen
      • 用你正在运行的完整 Laravel 查询更新你的问题。您使用的 a 别名是从哪里来的?我的猜测是你的代码是问题所在。
      • 先生,我正在使用 CodeIgniter
      【解决方案3】:

      FIND_IN_SET 在数组中搜索一个值并返回该值的索引,如果函数不为 0,则表示该值存在于列表中。 所以代码

        this->db->where("FIND_IN_SET(6, a.allowed_activity) !=",0);
      

      表示返回 a.allowed_activity 中值 6 的索引
      如果返回值与 0 不同,则 a.allowed_activity 中存在值 6

      WHERE ... IN 检查集合中的值但不返回索引.. 如果值存在或不存在,则返回 true 或 false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2020-03-26
        • 2016-02-10
        • 2013-08-07
        • 2011-10-20
        • 2020-01-23
        相关资源
        最近更新 更多