MySQL列表IN列表

Sir*_*Sir 10 mysql

我目前将用户的输入存储在逗号分隔的列表中,如下所示:

Userid | Options
1      |  1,2,5
Run Code Online (Sandbox Code Playgroud)

用户在表单中勾选一组选项,这是一个数组,然后用逗号连接

1,2,5
Run Code Online (Sandbox Code Playgroud)

然后MySQL试图找到其他用户,这些用户在不同的字段名称上勾选了一些或所有相同的选项(尽管是同一个表).

目前我这样做:

WHERE `choices` IN ('.$row['myoptions'].')
Run Code Online (Sandbox Code Playgroud)

所以这可能是这样的:

WHERE 1,2,5,8 IN (1,4,6)
Run Code Online (Sandbox Code Playgroud)

这将返回true,因为至少有一个值匹配正确吗?或者我有这个困惑..

Sta*_*arx 21

可能是你做错了.

如果选项列类型为,则函数FIND_IN_SET可能会有用SET.

例:

SELECT * FROM yourtabe WHERE FIND_IN_SET('2', Options);
Run Code Online (Sandbox Code Playgroud)

但是,它只允许您一次比较一个字符串,在上面的示例中,它比较行中是否存在2.如果必须比较多个值,则无法通过使用FIND_IN_SET来实现.

但是,在您的情况下,LIKE条款可能有用.

可能是这样的

SELECT * FROM yourtable WHERE Options LIKE '%2,3%';
Run Code Online (Sandbox Code Playgroud)

现在,这将在列中的任何位置搜索2,3值,并给出结果.但是,这也带有另一个并发症,它给仅当结果2,3是彼此并排存在,如果列2,1,3或者2,4,5,3甚至3,2它不会列出这些记录.

现在回答你的问题

`WHERE `choices` IN (1,4,6)`, 
Run Code Online (Sandbox Code Playgroud)

将转化为

WHERE `choices` = '1' OR `choices` = '4' OR `choices` = '6'
Run Code Online (Sandbox Code Playgroud)

所以它会回来 false

为什么?

因为您的列不仅包含1或4或6,而且1,2,5包含一个字符串.所以上面的所有比较都返回false