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<
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
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
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.