Php 逗号分隔选项的逗号分隔值的最佳搜索方式

Php 逗号分隔选项的逗号分隔值的最佳搜索方式,php,mysql,laravel,Php,Mysql,Laravel,我有包含列city_id的用户表,在该列中,city id存储为逗号分隔的值,如下所示: user_id user_name city_id 1 abc1 1,2,3 2 abc2 15,2,9 3 abc5 1,2,13 现在我想从city\u id列中搜索包含city id=1,9,13的行 如何做到这一点 预期输出: abc, abc1, abc3 您应该避免像当前那

我有包含列city_id的用户表,在该列中,city id存储为逗号分隔的值,如下所示:

user_id  user_name     city_id    
1        abc1           1,2,3
2        abc2           15,2,9
3        abc5           1,2,13
现在我想从city\u id列中搜索包含city id=
1,9,13
的行

如何做到这一点

预期输出:

abc, abc1, abc3

您应该避免像当前那样将CSV数据存储在
city\u id
列中。理想情况下,一条记录应该只有一个城市id的数据点。也就是说,MySQL提供了一个函数
FIND_IN_SET
,至少在某种程度上可以处理CSV数据。请尝试以下查询:

SELECT user_name
FROM yourTable
WHERE
    FIND_IN_SET('1', city_id) > 0 OR
    FIND_IN_SET('9', city_id) > 0 OR
    FIND_IN_SET('13', city_id) > 0;
我们可以通过使用
REGEXP
和regex交替
\b(1 | 9 | 13)\b
,使查询更加紧凑:

SELECT user_name
FROM yourTable
WHERE city_id REGEXP '[[:<:]](1|9|13)[[:>:]]';
选择用户名
从你的桌子上
WHERE city_id REGEXP'[[::]]';

不要这样存储数据。(注意,
[[::]]
是结束语。MySQL使用POSIX,而不是PCRE,因此需要相应地修改regexs。)