difference between where_in and find_in_set

后端 未结 3 1706
暗喜
暗喜 2021-01-24 18:09

I am working on a join query in which I have to get the data from a column which contain the comma separated values.like allowed_activity contain 1,2,3,4,5,6<

相关标签:
3条回答
  • 2021-01-24 18:53

    FIND_IN_SET search for a value in a array and return the index of the value then if the function is different than 0 this mean that the value in present in the list . so the code

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

    mean return the index of the value 6 in a.allowed_activity
    and if the value return is different that 0 then the value 6 is present in a.allowed_activity

    WHERE ... IN check if the value in the set but don't return the index .. just return true or false if the value is present or not

    0 讨论(0)
  • 2021-01-24 19:06

    WHERE IN requires the set of values to be specified literally in the query, not as a single value containing a comma-delimited string. If you write:

    WHERE 6 IN (a.allowed_activity)
    

    it will treat a.allowed_activity as just a single value, and compare it with 6, not as a set of multiple values to search.

    FIND_IN_SET searches a comma-delimited string for the value.

    Another way to view it is that IN is a shortcut for a bunch of = tests combined with OR:

    WHERE x IN (a, b, c, d)
    

    is short for

    WHERE x = a OR x = b OR x = c OR x = d
    

    When you rewrite it like this, you can see clearly why it won't work with a column containing a comma-delimited string. It simply translates

    WHERE 6 IN (a.allowed_activity) 
    

    to:

    WHERE 6 = a.allowed_activity
    
    0 讨论(0)
  • 2021-01-24 19:09

    The following code is incorrect:

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

    I'm surprised this even runs without error, but one possibility is that it is generating a WHERE clause which compares a string against 0. Of course, they will never be equal, and so this will always be true.

    If you want to call the native FIND_IN_SET() function, then you would need to use whereRaw():

    $this->db->whereRaw("FIND_IN_SET($activity_id, a.allowed_activity) !=0");
    

    Using WHERE IN (...) is incorrect here, because you have all the values in a single row, separated from commas. WHERE IN would make sense if you wanted to filter for certain values from many rows, each column having a single value.

    0 讨论(0)
提交回复
热议问题